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