我正在尝试为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 )
我不确定这是否有效,但至少它有效;)
答案 0 :(得分:2)
Lua中没有split
这样的功能(咨询参考手册是一个好的开始)。您应该使用wiki上描述的string.gmatch
函数:
data = "24:50:48"
for i in string.gmatch(data, "[^:]*") do
print(i)
end
此外,您正在搜索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,以获取将缓冲区范围数据转换为不同类型的可用方法的完整列表。