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

时间:2016-04-29 11:20:49

标签: lua wireshark string-conversion

我正在尝试为Wireshark编写自定义解剖器,它会将字节/十六进制输出更改为ASCII字符串。

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

Wireshark将此数据声明为字节序列。 对于Lua,数据类型为userdata(使用type(data)进行测试)。 如果我只是使用tostring(data)将其转换为字符串,我的解剖器将返回24:50:48,这是数组中字节的精确十六进制表示。

有没有办法直接将这个字节序列转换为ascii,或者你可以帮我将这个冒号分隔的字符串转换为ascii字符串吗?我对Lua完全不熟悉。我尝试了split(tostring(data),":")之类的内容,但这会返回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 )

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

2 个答案:

答案 0 :(得分:2)

Lua中没有split这样的功能(咨询参考手册是一个好的开始)。您应该使用wiki上描述的string.gmatch函数:

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

live example

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

答案 1 :(得分:2)

You need to mark range of bytes in the buffer that you're interested in and convert it to the type you want:

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

See TvbRange description in https://wiki.wireshark.org/LuaAPI/Tvb,以获取将缓冲区范围数据转换为不同类型的可用方法的完整列表。