openresty:将 int64 转换为字符串

我正在使用带有 Lua 5.1.4 的 openresty/1.7.7.2。我在请求中接收到 int64,并且我将其 字符串 格式保存在数据库中(无法更改数据库模式或请求格式)。我无法将它们匹配。

local i = 913034578410143848 --请求
local p = "913034578410143848" -- 存储在数据库中
print(p==tostring(i)) -- 返回 false
print(i%10) -- 返回 0 ..这也不起作用

是否有一种方法可以将 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
点赞
用户2328287
用户2328287

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-30 10:02:10