2016-04-29 712 views
1

我想为Wireshark编写自定义解析器,它将字节/十六进制输出更改为ASCII字符串。在lua中将字节序列转换为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

没有splitLua(咨询参考手册是一个很好的开始)这样的功能。作为wiki描述,您应该使用可能string.gmatch功能:

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

live example

而且你正在寻找string.char功能字节转换为ASCII字符。

+0

我看到有人用同样的方式分割,所以我也试过了。后来我发现,在Lua中没有分裂:(我会尽力去找你的方式,首先我必须跳过string.gmatch。 –

+0

它的空白条目,谢谢;) –

+0

任何downvote的原因,勇敢的游侠? – Jakuje

2

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

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

见TvbRange描述https://wiki.wireshark.org/LuaAPI/Tvb为转换缓冲的可用方法完整列表范围数据为不同类型。