項目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