1

我将 openresty/1.7.7.2 与 Lua 5.1.4 一起使用。我收到int64的请求,我将它的字符串格式保存在数据库中(无法更改数据库架构或请求格式)。我无法匹配他们两个。

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 转换为字符串,反之亦然?

更新:i从 protobuf 对象中获取。proto 文件描述i为 int64。我正在使用pb4luaprotobuf 库。

ngx.req.read_body()
local body = ngx.req.get_body_data()
local request, err = Request:load(body)
local i = request.id
4

1 回答 1

2

Lua 5.1 不能表示大于 2^53 的整数值。数字文字不是例外。所以你不能只写 local i = 913034578410143848。但是 LuaJIT 可以像装箱值一样表示 int64 值。还存在 Lua 库来处理大量数据。例如bn图书馆。我不知道你的 pb4lua 是如何处理这个问题的。例如lua-pb库使用 LuaJIT装箱值。它还提供了指定用户定义的回调以生成 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
于 2017-04-30T10:02:10.710 回答