为了方式封装和解析二进制数据 给tolua添加 ipack库 和一个lua的解析类 ByteArray

在lua中解析byte[]数据

ipcak https://github.com/LuaDist/lpack

参考 https://forum.cocos.com/t/bytearray/14319

1 从git上获得 ipack库

ipcak 库修改

2 在tolua-runtime库 https://github.com/topameng/tolua_runtime

添加ipack 注册 找到tolua.c文件 tolua_openlibs方法 添加这个方法

3 生成对应平台的库文件 这个教程后期出 不过需要这个功能的人应该也是会的

4 添加LUA代码

ipack =require 'ipack'
local setmetatable = setmetatable
local ByteArray =
{}ByteArray.__index = ByteArray
local typeEnum=
{OP_ZSTRING=   'z',--/* zero-terminated string */OP_BSTRING=    'p',--/* string preceded by length byte */OP_WSTRING=    'P',--/* string preceded by length word */OP_SSTRING=    'a',--/* string preceded by length size_t */OP_STRING=   'A',--/* string */OP_FLOAT=  'f',--/* float */OP_DOUBLE=  'd',--/* double */OP_NUMBER= 'n',--/* Lua number */OP_BYTE =  'c',--/* char is byte*/OP_UBYTE =    'b',--/* byte = unsigned char */OP_SHORT ='h',--/* short */OP_USHORT=    'H',--/* unsigned short */OP_INT  =  'i',--/* int */OP_UINT    =  'I',--/* unsigned int */OP_LONG   =  'l',--/* long */OP_ULONG=    'L',--/* unsigned long */OP_LITTLEENDIAN=    '<',--/* little endian */OP_BIGENDIAN=    '>',--/* big endian */OP_NATIVE=  '=',--/* native endian */
}--local    OP_ZSTRING=    'z'--/* zero-terminated string */
--local OP_BSTRING=    'p'--/* string preceded by length byte */
--local OP_WSTRING=    'P'--/* string preceded by length word */
--local OP_SSTRING=    'a'--/* string preceded by length size_t */
--local OP_STRING= 'A'--/* string */
--local OP_FLOAT=  'f'--/* float */
--local OP_DOUBLE= 'd'--/* double */
--local OP_NUMBER= 'n'--/* Lua number */
--local OP_CHAR =  'c'--/* char */
--local OP_BYTE =  'b'--/* byte = unsigned char */
--local OP_SHORT    ='h'--/* short */
--local OP_USHORT= 'H'--/* unsigned short */
--local OP_INT  =  'i'--/* int */
--local OP_UINT =  'I'--/* unsigned int */
--local OP_LONG =  'l'--/* long */
--local OP_ULONG=  'L'--/* unsigned long */
--local OP_LITTLEENDIAN=   '<'--/* little endian */
--local OP_BIGENDIAN=  '>'--/* big endian */
--local OP_NATIVE= '='--/* native endian */--
--@packedStr --已经打包的字节字符串 如果是创建写bytearray 此参数不需要传nil
--@endian --字节序 不传默认小字节序
--]]
function ByteArray:new(packedStr, endian)local t = {}setmetatable(t, self)self.packedStr =packedStrself.endian = endian or '<'self.fmt = {}self.data = {}self.position = 1self.__index = selfreturn t
end--清除数据--]]
function ByteArray:destroy()self.packedStr = nilself.fmt = nilself.data = nil
endfunction ByteArray:readByte()local val = 0self.position, val = ipack.unpack(self.packedStr, typeEnum.OP_BYTE, self.position)return val
endfunction ByteArray:writeByte(b)self.fmt[#self.fmt + 1] = typeEnum.OP_BYTEself.data[#self.data + 1] = b
endfunction ByteArray:readUByte()local val = 0self.position, val = ipack.unpack(self.packedStr, typeEnum.OP_UBYTE, self.position)return val
endfunction ByteArray:writeUByte(b)self.fmt[#self.fmt + 1] = typeEnum.OP_UBYTEself.data[#self.data + 1] = b
endfunction ByteArray:readShort()local val = 0self.position, val = ipack.unpack(self.packedStr, self.endian .. typeEnum.OP_SHORT, self.position)return val
end
function ByteArray:readUshort()local val = 0self.position, val = ipack.unpack(self.packedStr, self.endian .. typeEnum.OP_USHORT, self.position)return val
endfunction ByteArray:writeUShort(h)self.fmt[#self.fmt + 1] = typeEnum.OP_USHORTself.data[#self.data + 1] = h
endfunction ByteArray:writeShort(h)self.fmt[#self.fmt + 1] = typeEnum.OP_SHORTself.data[#self.data + 1] = h
endfunction ByteArray:readInt()local val = 0self.position, val = ipack.unpack(self.packedStr, self.endian .. typeEnum.OP_INT, self.position)return val
endfunction ByteArray:writeInt(i)self.fmt[#self.fmt + 1] = typeEnum.OP_INTself.data[#self.data + 1] = i
endfunction ByteArray:readDouble()local val = 0self.position, val = ipack.unpack(self.packedStr, self.endian .. typeEnum.OP_DOUBLE, self.position)return val
endfunction ByteArray:readUint()local val = 0self.position, val = ipack.unpack(self.packedStr, self.endian .. typeEnum.OP_UINT, self.position)return val
endfunction ByteArray:writeDouble(d)self.fmt[#self.fmt + 1] = typeEnum.OP_DOUBLEself.data[#self.data + 1] = d
endfunction ByteArray:readString()local l = self:readShort()local val = 0self.position, val = ipack.unpack(self.packedStr, typeEnum.OP_STRING .. l, self.position)return val
endfunction ByteArray:writeString(s)self:writeShort(#s)self.fmt[#self.fmt + 1] = typeEnum.OP_STRINGself.data[#self.data + 1] = s
end--获取打包后的 数据 -str--]]
function ByteArray:getbytesString()if self.packedStr and self.packedStr ~= '' thenreturn self.packedStrelseprint(self.endian .. table.concat(self.fmt))print(unpack(self.data))return ipack.pack(self.endian .. table.concat(self.fmt), unpack(self.data))end
endreturn ByteArray

使用方法 特别注意的是 大小端问题‘’<‘’ 如果解析失败 换下试试

如果解析数据是从C# 传过到lua的 记得要给数据加上标签[LuaByteBufferAttribute]  否则传过来是个table

 local ByteArray=require"ipack/ByteArray"local ba = ByteArray:new(nil, '<')ba:writeInt(333300)ba:writeString('fuck 1334 goddess')ba:writeShort(44)ba:writeByte(-3)ba:writeByte(122)local s = ba:getbytesString()print(#s, s)print('----------------')local ba2 = ByteArray:new(s, '<')print(ba:readInt())print(ba:readString())print(ba:readShort())print(ba:readByte())print(ba:readByte())

tolua lua 添加 C库的byte[] 解析 byteArray ipack相关推荐

  1. 编译tolua——3、以pbc为例子,添加第三方库

    目录 1.编译工具和环境说明 2.基础编译tolua 3.以pbc为例子,添加第三方库 4.更新luaJit 大家好,我是阿赵. 之前分享过怎样正常编译基础版本的tolua.这次用添加pbc为例,看看 ...

  2. go 库 viper 配置解析神器

    go 库 viper 配置解析神器 文章目录 go 库 viper 配置解析神器 1. 简介 2. 安装 3. 建立默认值 4. 读取配置文件 5. 获取 key/value 方法 5.1 Get() ...

  3. viper4android io错误,golang常用库之配置文件解析库-viper使用详解

    一.viper简介 viper 配置管理解析库,是由大神 Steve Francia 开发,他在google领导着 golang 的产品开发,他也是 gohugo.io 的创始人之一,命令行解析库 c ...

  4. python添加lxml库_7分钟,建议看完这5个Python库对比丨web抓取

    网页抓取的时候,如何决定哪一个库适合自己的特定项目?哪个Python库最灵活?5个示例找寻答案. 文丨ABHISHEK SHARMA 编译丨小二 "我们有足够的数据"这句话,在数据 ...

  5. Qt 添加 QtNetwork 库文件(包括vs中和qt中)

    Qt应用程序默认没有加QtNetwork库.如下图: 在开发过程中,因处理业务需要手动添加QtNetwork库.根据常见情况分为以下两种: [1]若使用QTCreator开发程序 在工程的pro文件中 ...

  6. 微型计算机原理考试试卷,微机原理试题集试题库(带答案解析)

    微机原理试题集试题库(带答案解析) (59页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 34.9 积分 完美WORD格式 微机原理及应用习题集库2一.填 ...

  7. 2023 华为 Datacom-HCIE 真题题库 11/12--含解析

    单项选择题 1.[试题编号:190685] (单选题)通过iMasterNCE-Campus部署的虚拟化园区网络场景中,以下关于"添加设备"的描述中,错误的是哪一项? A.IMas ...

  8. Vs2013添加静态库

    Vs2013添加静态库 如果想要使用静态库,需要头文件.和一个lib文件. 头文件添加: 项目->右键添加现有项,加入解决方案中,将头文件包含即可 文件.lib添加有两种方式: (1) 将静态库 ...

  9. Python|http|Chrome Developer Tools|Postman|HTTPie|builtwith库|python-whois库|爬虫及解析|语言基础50课:学习(10)

    文章目录 系列目录 原项目地址 第31课:网络数据采集概述 爬虫的应用领域 爬虫合法性探讨 Robots协议 超文本传输协议(HTTP) 相关工具(Chrome Developer Tools.Pos ...

最新文章

  1. 实现UILabel渐变色效果
  2. CodeForces - 444C DZY Loves Colors(线段树+剪枝)
  3. mysql 用户名中主机$_phpMyAdmin 尝试连接到 MySQL 服务器,但服务器拒绝连接。您应当检查配置文件中的主机、用户名和密码,...
  4. java 异常机制_深入理解Java异常处理机制
  5. 干货,记一次解决录音杂音问题
  6. Prometheus 监控服务端口、网站状态等(黑盒监测)
  7. 那些年我们看不懂的论文
  8. PS抠图滤镜Topaz ReMask白纱透明抠图法
  9. 六级,我一定要考好!
  10. 程序设计导引2.4——百练2801 填词
  11. 订单可视化(智能制造、流程再造、企业信息化) 第四篇 技术方案的制定
  12. 数据挖掘——关联分析基础介绍(上)
  13. 加快推进农粮产业链变革,中粮业绩创历史新高
  14. Windows输入法注入原理
  15. 华三交换机升级的ipe文件_交换机版本升级步骤
  16. 【全文】工信部正式发布《公共互联网网络安全突发事件应急预案》
  17. 希尔伯特空间(Hilbert space)
  18. 思维模型 罗森塔尔效应
  19. 程序设计基础系列作业(湖南师范大学)
  20. 【知识点】(五)多元函数微积分学

热门文章

  1. 实现基于SQLServer存储账号的MDaemon群集
  2. Bit-M开放 KGT/BTC和KGT/BMB 交易市场
  3. mysql数据库只读 改成正常_MySQL数据库设置为只读及测试【转】
  4. 办理3A等级信用证书有什么好处
  5. 直播电商抖音企业推广宣传活动营销策划方案ppt计划书
  6. 自定义jquery手风琴插件
  7. Omni Recover——适用的IOS数据的恢复方案
  8. workman如何实现异步任务
  9. 一度智信:关于拼多多商家经验分享
  10. 中国矿业大学计算机应用研究生就业,矿大算什么水平的211?附中国矿业大学就业方向...