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

4
我正在尝试编写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个回答

2

Lua中没有split函数(参考手册是一个好的开始)。您应该使用string.gmatch函数,如维基上所述:

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

(示例链接)

此外,您正在寻找 string.char 函数来将字节转换为 ASCII 字符。


我看到有人以同样的方式使用了split,所以我也尝试了一下。后来我发现Lua中没有split :( 我会尝试按照你的方式去做。首先,我必须跳过string.gmatch中的空条目。 - Soul Reaver
你在问我吗?我看不到这个答案旁边有踩的标记。但是现在我不确定是否在尝试接受这个答案时,我不小心将它踩了。当然,如果我真的踩了,它会立即被取消的。我确信最近发生过类似的事情,只是不确定是否发生在这个讨论串/问题/答案上。 - Soul Reaver
@SoulReaver 如果你没有看到踩的标记,那么它不是你。这只是一个普通的问题,如果发生了踩的情况,踩的人会再次出现。 - Jakuje

2
你需要在缓冲区中标记出你感兴趣的字节范围,并将其转换为你想要的类型:
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描述,获取将缓冲区范围数据转换为不同类型的可用方法的完整列表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接