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;
*