【问题标题】:How to cast string to uint32 luajit ffi如何将字符串转换为 uint32 luajit ffi
【发布时间】:2019-11-15 02:48:18
【问题描述】:

考虑到str 是一个二进制字符串,它在位置 13 处包含一个无符号整数 32。

我试过了:

local value = ffi.cast("uint32_t", ffi.new("char[4]", str:sub(13,16)))

但是,返回的数据是 unsigned int 类型的“cdata”,我现在不知道如何获取实际值(Int)

【问题讨论】:

  • tonumber(cdata)
  • 但是你的表达式计算的是字符串的地址而不是你想要的。

标签: casting lua ffi unpack luajit


【解决方案1】:

总的来说,我同意 Egor Skriptunoffs 的回答。对于更通用的方法(对于这种特殊情况,可能有点矫枉过正),可以使用联合类型

local ffi = require 'ffi'

local union_type = ffi.typeof [[
  union {
    char bytes[4];
    uint32_t integer;
  }
]]

local union = union_type { bytes = 'abcd' }

print(string.format('0x%x', union.integer))

请注意,您需要在这里担心字节顺序;您可以使用ffi.abi('le')ffi.abi('be') 确认您的系统字节序。如果您从其他地方(例如通过网络)获取字符串,则它的字节顺序很可能记录在某个地方。

假设您想将上述示例 (abcd) 中的字符串解释为大端;那么你可以这样做

local union do
  if ffi.abi('le') then
    union = union_type { bytes = ('abcd'):reverse() }
  else
    union = union_type { bytes = 'abcd' }
  end
end

如果系统是小端,则反转字符串。否则保持原样。

【讨论】:

    【解决方案2】:

    索引将cdata数组转换为Lua数

    local value = ffi.cast("uint32_t*", ffi.new("const char*", str:sub(13,16)))[0]
    

    【讨论】:

      猜你喜欢
      • 2017-02-01
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      • 1970-01-01
      • 2021-07-11
      • 2014-07-31
      • 2017-06-03
      • 1970-01-01
      相关资源
      最近更新 更多