Lua-pb 升级到Lua5.3

项目lua库升级到5.3版本后,最头疼的就是原先的一些第三方库原先只是基于lua5.1设计的,好比protobuff 相关的的. 以前项目引入Lua-pb 实现protobuf的解析和使用,可是这个库对64位的数据大可能是基于32位,有些地方须要修改下。html

替换 Struct pack/unpack

Struct彷佛不支持64位数据的,好比下面的测试,struct.unpack解压后不会大于0xffffffff,也有多是C库编译的时候有特别的设置。 反正最后替换为 Lua5.3 自带的string.pack/string.unpack来实现数据pack/unpackgit

local num = 0x100010ffffffff
printf("src num %d", num)   -- 1ffffffff

local packData =struct.pack('<I8', num)
local num2 = struct.unpack('<I8',packData)  -- ffffffff
printf("src num %d", num2)

local stringPack = string.pack("<i8",num)
local num3 = string.unpack('<i8',stringPack)
printf("src num %d", num3)   -- 1ffffffff

替换 Bit库

Lua-pb 中bit库是使用Luajit中的bit库,引入Lua5.3后就不须要,使用lua5.3实现相似的操做便可,并且支持64位位操做。
What’s new in Lua 5.3 (alpha work 2) 给出了一些方案,能够做为参考。
替换bit库的实现方案:github

local bit53 = {}
bit53.band = function(a, b)
    return a & b
end
bit53.bor = function(a, b)
    return a | b
end
bit53.bxor = function(a, b)
    return a ~ b
end
bit53.bnot = function(a)
    return ~ a
end
bit53.lshift = function(a, b)
    return a << b
end
bit53.rshift = function(a, b)
    return a >> b
end
bit53.arshift = function(a, b)
    a = a & 0xFFFFFFFF
    if b <= 0 or (a & 0x80000000) == 0 then
        return (a >> b) & 0xFFFFFFFF
    else
        return((a >> b) | ~(0xFFFFFFFF >> b)) & 0xFFFFFFFF
    end
end

大数编码

以前基于32位的版本,实现比较大的数字(64位)输是经过转换为字符的方式进行的,Lua5.3下 就能够不使用这种方式,例以下面的测试,message,parse后并不能还原,超过32位的部分和输入不对应。wordpress

//pb 文件
package big_numbers;
message BigNumbers1 {
  required uint64 field1 = 1;
}

//测试文件
local pb = require"pb"
-- load .proto file.
local big_nums = require"protos.big_numbers"
local Max64 = 0x1fffffffffffff
local Max32 = 0xffffffff
local BigNumbers1 = big_nums.BigNumbers1
local msg = BigNumbers1()
msg.field1 = Max64
pb.print(msg)
local bin = msg:Serialize()
print("--- decode message")
local msg1, off = assert(BigNumbers1():Parse(bin))
print(tonumber(msg1.field1))

问题:
local H3 = 0x1ffffffffffffff / 0x100000000 计算获得的结果0x2000000 而不是 0x1ffffff ,彷佛是计算溢出的问题,能够这样修改:测试

local l = num %  0x100000000
local h = (num - l) / 0x100000000

参考:
Bitwise operation
What’s new in Lua 5.3 (alpha work 2)
Google Protocol Buffers Encoding
Google Protocol Buffers 编码(Encoding)ui

相关文章
相关标签/搜索