我在Lua 5.1.4中使用openresty / 1.7.7.2。我在请求中收到了 int64 ,并且我将其字符串格式保存在DB中(无法更改数据库架构或请求格式)。我无法匹配它们。
local i = 913034578410143848 --request
local p = "913034578410143848" -- stored in DB
print(p==tostring(i)) -- return false
print(i%10) -- return 0 ..this also doesn't work
有可能将int64转换为字符串,反之亦然吗?
更新
我从protobuf对象得到i
。 proto文件将i
描述为int64。我正在使用pb4lua
库来进行protobuf。
ngx.req.read_body()
local body = ngx.req.get_body_data()
local request, err = Request:load(body)
local i = request.id
答案 0 :(得分:1)
Lua 5.1不能表示大于2 ^ 53的整数值。
数字字面不是兴奋。所以你不能只写
local i = 913034578410143848
。
但是LuaJIT可以表示像盒装值这样的int64值。
还有Lua库来处理大量数据。
例如。 bn
库。
我不知道你的pb4lua如何处理这个问题。
例如。 lua-pb
库使用LuaJIT boxed values。
它还提供了指定用户定义的回调以生成int64值的方法。
首先,我建议弄清楚i
值的实际类型(使用type
函数)。
所有其他人真的取决于它。
如果它是number
那么我认为pb4lua只是松散了一些信息。
可能只是返回string
类型,因此您可以将其作为字符串进行比较。
如果它提供LuaJIT cdata,那么这是转换字符串的基本功能
到int64值。
local function to_jit_uint64(str)
local v = tonumber(string.sub(str, 1, 9))
v = ffi.new('uint64_t', v)
if #str > 9 then
str = string.sub(str, 10)
v = v * (10 ^ #str) + tonumber(str)
end
return v
end