我写lua解剖器时遇到字符串问题.我的数据包看起来像: 0000 00 00 00 69 00 10 00 01 00 00 00 ed 00 00 00 0c0010 bf a6 5f ... 调试时,tvb看起来一样 偏移量0x10处的字节是0xbf,但在我的解剖器函数中,我得
0000 00 00 00 69 00 10 00 01 00 00 00 ed 00 00 00 0c 0010 bf a6 5f ...
调试时,tvb看起来一样
偏移量0x10处的字节是0xbf,但在我的解剖器函数中,我得到了不同的结果,这里是我的代码:
local str = buf(0x10):string() local x = string.byte(str, 1)
变量x应该是0xbf,但它是0xef,而其他一些偏移量也是0xef:
local str = buf(0x11):string() local x = string.byte(str, 1) -- also get 0xef, should be 0xa6 local str = buf(11):string() local x = string.byte(str, 1) -- also get 0xef, should be 0xed
似乎大值总是会得到0xef,如0xa6 / 0xbf / 0xed …
小值将是正确的,如0x69 / 0x5f / 0x0c …
我正在使用最新的wireshark 2.0,这是一个错误吗?
我对Wireshark的了解并不多,但我很清楚发生了什么.您正在使用Wireshark的tvbrange:string([encoding])函数.我在Wireshark网站上找到的文档说默认编码是ENC_ASCII. 0x80-0xFF(您报告的问题)范围内的字节不是有效的ASCII.
Wireshark可能正在做的是将这些转换为U FFFD,Unicode的“替换字符”.这是在Unicode字符串中表示未知字符的标准做法.
然后,Wireshark可能在返回Lua时将此字符串编码为UTF-8. U FFFD的UTF-8编码的第一个字节是0xEF,这就是你所看到的.
如果你想从TVB获取原始字节值,可以尝试使用tvbrange:bytes([encoding])函数来获取值.例如
local bytes = buf(0x10):bytes() local x = bytes:get_index(0) -- maybe 1, I'm not sure if it would be 0 or 1 indexed
也可能有一些编码你可以传递给tvbrange:字符串可以做你想要的,但我找不到任何好的参考.