tolua lua 添加 C库的byte[] 解析 byteArray ipack
为了方式封装和解析二进制数据 给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相关推荐
- 编译tolua——3、以pbc为例子,添加第三方库
目录 1.编译工具和环境说明 2.基础编译tolua 3.以pbc为例子,添加第三方库 4.更新luaJit 大家好,我是阿赵. 之前分享过怎样正常编译基础版本的tolua.这次用添加pbc为例,看看 ...
- go 库 viper 配置解析神器
go 库 viper 配置解析神器 文章目录 go 库 viper 配置解析神器 1. 简介 2. 安装 3. 建立默认值 4. 读取配置文件 5. 获取 key/value 方法 5.1 Get() ...
- viper4android io错误,golang常用库之配置文件解析库-viper使用详解
一.viper简介 viper 配置管理解析库,是由大神 Steve Francia 开发,他在google领导着 golang 的产品开发,他也是 gohugo.io 的创始人之一,命令行解析库 c ...
- python添加lxml库_7分钟,建议看完这5个Python库对比丨web抓取
网页抓取的时候,如何决定哪一个库适合自己的特定项目?哪个Python库最灵活?5个示例找寻答案. 文丨ABHISHEK SHARMA 编译丨小二 "我们有足够的数据"这句话,在数据 ...
- Qt 添加 QtNetwork 库文件(包括vs中和qt中)
Qt应用程序默认没有加QtNetwork库.如下图: 在开发过程中,因处理业务需要手动添加QtNetwork库.根据常见情况分为以下两种: [1]若使用QTCreator开发程序 在工程的pro文件中 ...
- 微型计算机原理考试试卷,微机原理试题集试题库(带答案解析)
微机原理试题集试题库(带答案解析) (59页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 34.9 积分 完美WORD格式 微机原理及应用习题集库2一.填 ...
- 2023 华为 Datacom-HCIE 真题题库 11/12--含解析
单项选择题 1.[试题编号:190685] (单选题)通过iMasterNCE-Campus部署的虚拟化园区网络场景中,以下关于"添加设备"的描述中,错误的是哪一项? A.IMas ...
- Vs2013添加静态库
Vs2013添加静态库 如果想要使用静态库,需要头文件.和一个lib文件. 头文件添加: 项目->右键添加现有项,加入解决方案中,将头文件包含即可 文件.lib添加有两种方式: (1) 将静态库 ...
- Python|http|Chrome Developer Tools|Postman|HTTPie|builtwith库|python-whois库|爬虫及解析|语言基础50课:学习(10)
文章目录 系列目录 原项目地址 第31课:网络数据采集概述 爬虫的应用领域 爬虫合法性探讨 Robots协议 超文本传输协议(HTTP) 相关工具(Chrome Developer Tools.Pos ...
最新文章
- 实现UILabel渐变色效果
- CodeForces - 444C DZY Loves Colors(线段树+剪枝)
- mysql 用户名中主机$_phpMyAdmin 尝试连接到 MySQL 服务器,但服务器拒绝连接。您应当检查配置文件中的主机、用户名和密码,...
- java 异常机制_深入理解Java异常处理机制
- 干货,记一次解决录音杂音问题
- Prometheus 监控服务端口、网站状态等(黑盒监测)
- 那些年我们看不懂的论文
- PS抠图滤镜Topaz ReMask白纱透明抠图法
- 六级,我一定要考好!
- 程序设计导引2.4——百练2801 填词
- 订单可视化(智能制造、流程再造、企业信息化) 第四篇 技术方案的制定
- 数据挖掘——关联分析基础介绍(上)
- 加快推进农粮产业链变革,中粮业绩创历史新高
- Windows输入法注入原理
- 华三交换机升级的ipe文件_交换机版本升级步骤
- 【全文】工信部正式发布《公共互联网网络安全突发事件应急预案》
- 希尔伯特空间(Hilbert space)
- 思维模型 罗森塔尔效应
- 程序设计基础系列作业(湖南师范大学)
- 【知识点】(五)多元函数微积分学