许多 Actionscript 程序员已经从 Flash 转到 Cocos2d-x 了。那么以前的那些超级好用的类库都不见了,只好重新来过。

我利用 Lua 和 lpack 库实现了一套 lua版本的 ByteArray 。这套库用于 quick-cocos2d-x(后称quick) 中。因此依赖一些 quick 中已经包含的c库和lua库 。

主要依赖如下:

lpack (已经包含在quick中)
BitOp (已经包含在quick中)
quick framework
utils.ByteArray

ByteArray依赖 lpack 。

lpack 其实已经足够好用了。但是由于lpack的指针功能有限,所以使用起来还是有些麻烦。这个类模仿了 Actionscript 的 flash.utils.ByteArray ,指针在内部实现,方便读取和缓存 socket 服务器数据。

当然了,有一点点不同,但或许更好用。

下面是使用ByteArray的例子:
-- 直接使用 lpack 库生成一个字节流
local __pack = string.pack("<bihP2", 0x59, 11, 1101, "", "中文")
-- 创建一个ByteArray
local __ba = ByteArray.new()
-- ByteArray 允许直接写入 lpack 生成的字节流
__ba:writeBuf(__pack)
-- 不要忘了,lua数组是1基的。而且函数名称比 position 短
__ba:setPos(1)
-- 这个用法和AS3相同了,只是有些函数名称被我改掉了
print("ba.len:", __ba:getLen())
print("ba.readByte:", __ba:readByte())
print("ba.readInt:", __ba:readInt())
print("ba.readShort:", __ba:readShort())
print("ba.readString:", __ba:readStringUShort())
print("ba.available:", __ba:getAvailable())
-- 自带的toString方法可以以10进制、16进制、8进制打印
print("ba.toString(16):", __ba:toString(16))
-- 创建一个新的ByteArray
local __ba2 = ByteArray.new()
-- 和AS3的用法相同,还支持链式调用
__ba2:writeByte(0x59)
:writeInt(11)
:writeShort(1101)
-- 写入空字符串
__ba2:writeStringUShort("")
-- 写入中文(UTF8)字符串
__ba2:writeStringUShort("中文")
-- 十进制输出
print("ba2.toString(10):", __ba2:toString(10))
下面就是效果了:

luabytearray

utils.ByteArrayVarint

ByteArrayVarint 继承 ByteArray,同时依赖 BitOp。

ByteArrayVarint 实现了 google protocol buffer协议中的Varint编码 。

Protocol Buffer协议是何方神圣,google一下就知道。简单说就是能大幅降低 socket 协议中传递的字节流的长度。但是protocol buffer协议还包含许多东西,而我只需要 varint 编码而已。

我们的上一个游戏就在 AS3中实现了varint编码 。现在又用lua实现了一遍。

方法名称 说明
ByteArrayVarint.readUVInt() read a unsigned varint int
ByteArrayVarint.writeUVInt() write a unsigned varint int
ByteArrayVarint.readVInt() read varint int
ByteArrayVarint.writeVInt() write varint int
ByteArrayVarint.readStringUVInt() read a string preceding a unsigned varint int
ByteArrayVarint.writeStringUVInt() write a string preceding a unsigned varint int
虽然lua支持64位数字,但由于 BitOp 仅支持32位有符号整数,这个 ByteArrayVarint 类能做的事情有限,甚至比AS3的都要差点(AS3好歹还支持32位无符号整数)。但如果程序中不使用变态的64位(或更高)数字的话,还是挺好的。

转载于:https://www.cnblogs.com/xiaoleiel/p/8295697.html

用lua实现ByteArray和ByteArrayVarint相关推荐

  1. tolua lua 添加 C库的byte[] 解析 byteArray ipack

    为了方式封装和解析二进制数据 给tolua添加 ipack库 和一个lua的解析类 ByteArray 在lua中解析byte[]数据 ipcak https://github.com/LuaDist ...

  2. 使用 lua 编写 wireshark 协议解析插件

    一.平台 操作系统:windows 7 wireshark:1.10.3 lua:5.1 二.准备 lua 语言基本语法,特别是关于表操作和循环 wireshark 文档,包括用户使用文档和开发者文档 ...

  3. CF-IOT之LUA语言开发

    概述 CFIOT内置了丰富的API接口,以模块的形式类聚这些API接口,并导入到内置的LUA虚拟机,供用户的LUA脚本调用,用户可使用CFIOT云端通讯协议远程更新LUA脚本和管理虚拟机,如关闭.启动 ...

  4. cocosstudio csd文件解析为.lua

    在学习python过程中,有幸能够看到一位大神在网页中公开的一个关于<CocosStudio 文件解析工具CsdAnalysis>的源码.本人使用稍作改变,由原有的.csd文件转换为C++ ...

  5. Nginx与Lua利用fpm打成rpm包

    1.下载相关软件 需要软件有:Nginx,LuaJIT,ngx_devel_kit,ngx_lua等安装文件 安装Lua或者LuaJIT都是可以的,但是出于效率的考虑,推荐安装LuaJITshell& ...

  6. pythonbyte连接_Python3之字节串bytes与字节数组bytearray的使用详解

    字节串bytes 字节串也叫字节序列,是不可变的序列,存储以字节为单位的数据 字节串表示方法: b"ABCD" b"\x41\x42" ... 字节串的构造函数 ...

  7. lua中正则表达式的坑

    我在使用OpenResty编写lua代码时,需要使用到lua的正则表达式,其中pattern是这样的, --热水器设置时间 local s = '12:33' local pattern = &quo ...

  8. 在CentOS 6.9 x86_64搭建Lua开发环境

    安装依赖库 yum -y install readline-dev readline-devel 下面源码编译lua时需要用到 安装lua-5.1.5 wget http://www.lua.org/ ...

  9. 利用lua中的string.gsub来巧妙实现json中字段的正则替换

    业务需求 工作中需要对某个请求的json响应中的某个字段进行替换, 通常想到的方法是,先使用lua的cjson模块解析该json响应, 取出该json字段再该改写它的值. 在这样实现的过程中,遇到一些 ...

最新文章

  1. 【转载】“error LNK1169: 找到一个或多个多重定义的符号”的解决方法
  2. int 和integer的区别
  3. python 中的*(星号)和**(双星号)简介
  4. SpringBoot - Spring Boot 应用剖析
  5. Hibernate里自定义UserType时取不到值的问题
  6. smarty能创建 php页面,php+smarty生成静态页面详解
  7. 【前端3】jquary:页面加载,选择器,隔行换色,Dom,全选,动画,遍历,广告/抽奖,表单校验插件
  8. 国家开放大学2021春1073法律文书答案
  9. LeetCode 1586. 二叉搜索树迭代器 II(数组+栈)
  10. MySQL 修改和删除触发器
  11. 这个统一了238个机器学习模型R包的参考手册推荐给你
  12. Spring 相关jar包下载及其地址(官方下载地址 )
  13. vue如何设置视频封面_vue制作朋友圈封面视频_朋友圈封面设置视频
  14. 青龙面板之运行脚本文件
  15. word表格美化技巧:如何统一改变表格的样式
  16. 【废墟】知我者谓我心忧,不知我者谓我何求~
  17. java happen-before_Java happen-before规则
  18. XCode 3 中我的常用快捷键
  19. mmdetectionv2.0修改类别数与数据集图片后缀
  20. Bugku CTF 眼见为实(MISC)

热门文章

  1. axios传递数据到java_axios 传输与springboot后台接收数据
  2. connot+connect+mysql+127.0.0.1_无法远程连接 MySQL 的解决方法
  3. mysql如何容器化_MySQL容器化详细教程
  4. pmos低电平驱动_三极管和MOS管驱动电路的正确用法
  5. 计算机的硬盘 u盘启动,U盘启动和硬盘启动两种不同教程步骤
  6. SparkStreaming transform算子入门案例
  7. 三、JVM — 类加载过程
  8. [对象转原始类型总结] ('' + obj) === `${obj}`? 不一定!
  9. 深入浅出解读 Java 虚拟机的差别测试技术
  10. 朴素贝叶斯常见面试题