openresty:将int64转换为字符串

时间:2017-04-30 03:53:22

标签: nginx lua protocol-buffers tostring openresty

我在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

1 个答案:

答案 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