当前位置: 首页 > news >正文

用lua实现ByteArray和ByteArrayVarint

许多 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位(或更高)数字的话,还是挺好的。

相关文章:

  • 作业2
  • 缓冲区溢出漏洞(2)
  • Visual Studio VS如何重置所有设置
  • Twirp:一个很酷的基于Go的新RPC框架
  • Nginx+Tomcat搭建高性能负载均衡集群
  • 我的第一篇博客
  • 我讲个事情哈,编程其实是文科
  • 基于Docker和Debian打造个人专属操作系统
  • thinkphp在前端页面的js代码中可以使用 U方法吗? 可以使用模板变量如__URL__等吗?...
  • 编写符合Python风格的对象
  • 二叉树基础之序列化和反序列化二叉树
  • 数组作业
  • Linux进程管理
  • Spring系列之-Aware系列接口
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 230. Kth Smallest Element in a BST
  • AngularJS指令开发(1)——参数详解
  • echarts花样作死的坑
  • java小心机(3)| 浅析finalize()
  • jquery ajax学习笔记
  • PAT A1050
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • windows下mongoDB的环境配置
  • 翻译:Hystrix - How To Use
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 来,膜拜下android roadmap,强大的执行力
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 前嗅ForeSpider采集配置界面介绍
  • 嵌入式文件系统
  • 深入浅出webpack学习(1)--核心概念
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 微信小程序设置上一页数据
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • #{}和${}的区别是什么 -- java面试
  • #Lua:Lua调用C++生成的DLL库
  • #Spring-boot高级
  • $forceUpdate()函数
  • %check_box% in rails :coditions={:has_many , :through}
  • (04)odoo视图操作
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (HAL库版)freeRTOS移植STMF103
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (九)c52学习之旅-定时器
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .Net下的签名与混淆
  • .NET中统一的存储过程调用方法(收藏)
  • /bin、/sbin、/usr/bin、/usr/sbin
  • @JsonSerialize注解的使用
  • @Responsebody与@RequestBody
  • @SuppressLint(NewApi)和@TargetApi()的区别