Quick-Cocos2d-x 自己实现 readULong/writeULong

quick-3.2rc1中已经删除 LUA.BYTEARRAY 中与 LONG 相关的方法(readLong/writeLong/readULong/writeULong),具体情况请看@ZRONG博客:http://zengrong.net/post/2134.htm

实现办法:
读的时候,用 readUByte() 分8次读入,转换成二进制字符串连接起来,再用 tonumber() 转换返回。
写的时候,先转成64字节的二进制字符串,分8段转成数字用 readUByte() 写入即可。



local utils = require("framework.cc.utils.init");
local parser = utils.ByteArray.new(utils.ByteArrayVarint.ENDIAN_BIG);

---
-- 十进制转换成二进制字符串
-- 
-- @param num number 十进制数字
-- @param len number 返回二进制字符串长度
-- @return string
-- @author Hobin
-- 
local function tobinary(num, len)
    len = len or 8;
    local bits = {};

    for i = 1, len do
        table.insert(bits, num % 2);
        num = math.floor(num / 2);
        if num == 0 then break; end
    end

    local result = string.rep("0", len - #bits);
    for i = #bits, 1, -1 do
        result = result .. bits*;
    end;
    return result;
end;

---
-- 按顺序转换成二进制字符串并连接起来,最后将字符串转数字
-- 
-- @author Hobin
-- 
local function readULong()
    local bin = "";
    for i = 1, 8 do
        bin = bin .. tobinary(parser:readUByte());
    end
    return tonumber(bin, 2);
end;

---
-- 转换成长度为64的二进制字符串,分成8部分再转成十进制写入
-- 
-- @param num number
-- @author Hobin
-- 
local function writeULong(num)
    local pos = 1;
    local bin = tobinary(num, 64);
    for i = 1, 8 do
        local byte = tonumber(string.sub(bin, pos, pos + 7), 2);
        parser:writeUByte(byte);
        pos = pos + 8;
    end;
end;

*

楼主有测试32位环境和64位环境的区别吗

忘了说,这个仅当做读写UINT64,32位环境的确有问题,这也是作者删掉的原因,详细的还是去@ZRONG博客看吧。为避免搞混,考虑将方法名改为readUINT64/writeUINT64好了!~~