zoukankan      html  css  js  c++  java
  • 用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位(或更高)数字的话,还是挺好的。

  • 相关阅读:
    TP5报如下的错误 Indirect modification of overloaded element of thinkpaginatorCollection has no effect【转】
    PHPnumber_format()函数的使用
    蓝桥杯-PREV28-地宫取宝
    HihoCode-1053-居民迁移
    HihoCode-1323-回文字符串
    蓝桥杯-PREV3-带分数
    HDU-6312-Game
    HDU-6438-Buy and Resell
    CF-1117C-Magic Ship
    HDU-2802-F(N)
  • 原文地址:https://www.cnblogs.com/xiaoleiel/p/8295697.html
Copyright © 2011-2022 走看看