Python Scapy padding.load';g';和'|';象征

Python Scapy padding.load';g';和'|';象征,python,hex,scapy,Python,Hex,Scapy,我将值为4的无符号long-long和值为8616616的附加无符号long-long附加到tcp数据包中(我不记得第二个值)。 我在Ubuntu32上用c语言编写,所以unsignedlong是8字节 我用scapy嗅了嗅这个包,然后打印padding.load。 在输出中,我看到一些我不理解的符号-g| 另外,加载应该是16字节,但我看不到16字节 如果我只附加一个无符号的long,我会得到8个字节,我看不到这些符号 >>> pkt = sniff(count=2,filt

我将值为4的无符号long-long和值为8616616的附加无符号long-long附加到tcp数据包中(我不记得第二个值)。 我在Ubuntu32上用c语言编写,所以unsignedlong是8字节

我用scapy嗅了嗅这个包,然后打印padding.load。 在输出中,我看到一些我不理解的符号-g| 另外,加载应该是16字节,但我看不到16字节

如果我只附加一个无符号的long,我会得到8个字节,我看不到这些符号

>>> pkt = sniff(count=2,filter="tcp")
>>> raw  = pkt[1].sprintf('%Padding.load%')
>>> raw
"'\\x04\\x00\\x00\\x00\\x00\\x00\\x00\\x00g\\xc4|\\x00\\x00\\x00\\x00\\x00'"


>>> print raw
'\x04\x00\x00\x00\x00\x00\x00\x00g\xc4|\x00\x00\x00\x00\x00'

打印
raw
的值时,python将所有值大于31的字节解释为ASCII字符。当您看到
g
时,该字节的值等于103,同样
|
是124的ASCII码。对于127以上的字符,python使用不同的表示法,这就是为什么在输出中有
\xc4
,该字节的值是196

raw
中每个字节的实际值为:

[4, 0, 0, 0, 0, 0, 0, 0, 103, 196, 124, 0, 0, 0, 0, 0]
它有16个字节长

您可以通过将每个字节的值转换回一个字符来测试这一点:

>>> values = [4, 0, 0, 0, 0, 0, 0, 0, 103, 196, 124, 0, 0, 0, 0, 0]
>>> as_characters = ''.join(chr(c) for c in values)
>>> as_characters
'\x04\x00\x00\x00\x00\x00\x00\x00g\xc4|\x00\x00\x00\x00\x00'
>>> len(as_characters)
16

我想你的
raw
的每一个字节都被转义了。在我的示例中,当我将
输出为_字符时,我只看到一个反斜杠,您有两个。您可能需要使用类似于
pkt[1].sprintf('%Padding.loadr%')
的方法来获取非转义版本。

谢谢,有没有一种简单的方法可以获取8个字节并将其转换为int(还需要转换为big indian)我知道unpack假设要这样做,但我不知道如何将其表示为8个十六进制的元组。请看一下如何使用struct<代码>结构解包('b',我的字节)
。对8执行此操作将是
struct.unpack('8b',my_字节)
。您可能需要
struct.unpack('2Q',raw)
,它返回
(48176743)
Q
表示
unsigned long