将字节序列转换为 lua 中的 ASCII 字符串

Conversion of sequence of bytes to ASCII string in lua

我正在尝试为 Wireshark 编写自定义解析器,它将 byte/hex 输出更改为 ASCII 字符串。

我能够编写这个解剖器的主体并且它有效。我唯一的问题是将此数据转换为 ASCII 字符串。

Wireshark 将此数据声明为字节序列。 Lua 的数据类型是 userdata(使用 type(data) 测试)。 如果我简单地使用 tostring(data) 我的解析器 returns 24:50:48 将它转换为字符串,这是数组中字节的精确十六进制表示。

有没有什么办法可以直接将这个字节序列转换成ascii,或者你能帮我把这个冒号分隔的字符串转换成ascii字符串吗?我是 Lua 的新手。我试过 split(tostring(data),":") 之类的东西,但是这个 returns Lua Error: attempt to call global 'split' (a nil value)


使用 Jakuje 的回答我能够创建这样的东西:

function isempty(s)
  return s == nil or s == ''
end
data = "24:50:48:49:4A"
s = ""
for i in string.gmatch(data, "[^:]*") do
    if not isempty( i ) then
        print(string.char(tonumber(i,16)))
        s = s .. string.char(tonumber(i,16))
    end
end
print( s )

我不确定这是否有效,但至少有效 ;)

Lua (consulting reference manual is a good start). You should use probably string.gmatch function as described on wiki中没有split这样的函数:

data = "24:50:48"
for i in string.gmatch(data, "[^:]*") do
  print(i)
end

(live example)

此外,您正在搜索 string.char 将字节转换为 ascii 字符的函数。

您需要在缓冲区中标记您感兴趣的字节范围并将其转换为您想要的类型:

data:range(offset, length):string()
-- or just call it, which works the same thanks to __call metamethod
data(offset, length):string()

有关将缓冲区范围数据转换为不同类型的可用方法的完整列表,请参阅 https://wiki.wireshark.org/LuaAPI/Tvb 中的 TvbRange 说明。