- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
级别:初级。我目前正在使用原始套接字使用 python 开发嗅探器。我有一个关于在 struct 模块提供的 unpack() 中使用的格式说明符的一般性问题。当我们使用此方法根据指定的格式说明符解压缩数据时。我见过很多嗅探器程序使用 unpack() 从十六进制形式解码数据包信息。例如,为了提取以太网头信息,可以使用以下代码:
ethHeader = struct.unpack("!6s6s2s", ethernetHeader)
这里的 ethernetHeader 是一个变量,它包含之前从原始套接字捕获的实际以太网 header 数据。现在我的问题是如何知道标题使用哪种格式说明符?我怎么能提前知道以太网地址是字符串格式还是其他格式?是否也有任何文档。我阅读了与 unpack() 相关的 python 文档,但没有找到任何信息。同样在 IP 地址的情况下,代码是这样的:
ipAddresses = struct.unpack("!12s4s4s", IPAddresses)
这里的 IPAddresses 是一个变量,它包含之前从原始套接字捕获的实际 IP 地址信息。我又怎么知道我必须使用字符串作为格式说明符 (!12s4s4s)。谢谢。
最佳答案
感谢 J.F. Sebastian 的提示。我终于弄明白了,将花一些时间在这里解释。通常我们必须在每个 header 的结构中查找 C 类型,以了解数据包不同 header 中的每个字段使用的是什么 C 类型。然后我们可以使用这个 table知道哪个格式说明符将代表哪个 C 类型。例如,在 IP header 的情况下,结构如下所示:
struct ipheader {
unsigned char ip_hl:4, ip_v:4; /* this means that each member is 4 bits */
unsigned char ip_tos;
unsigned short int ip_len;
unsigned short int ip_id;
unsigned short int ip_off;
unsigned char ip_ttl;
unsigned char ip_p;
unsigned short int ip_sum;
unsigned int ip_src;
unsigned int ip_dst;
};
例如:unsigned char 表示为“B”,unsigned int 表示为“I”。现在我们可以使用这个方法来了解应该在 struct.unpack() 中使用什么格式说明符来获取 IP header 的字段值。在 IP header 的情况下,它变成如下:
struct.unpack('!BBHHHBBHII')
但是你会注意到大多数程序使用 struct.unpack('!BBHHHBBH4s4s')
。
所以问题出现了,为什么在 unsigned int ip_src;
和 unsigned int ip_dst;
的情况下使用 's' 而不是 'I' 作为 struct.unpack()
。原因是如果“I”用作格式说明符,则 unpack()
方法会以整数形式返回 IP 地址(例如:3232267778)。然后你必须将它转换为实际的 IP 地址形式(例如:10.0.0.1)。通常在 Internet 上可用的嗅探器程序中,只需使用 socket.inet_ntoa()
来获取实际的 ip 地址。此方法接受字符串类型而不是整数类型。这就是为什么在 unsigned int ip_src 情况下的原因; & 无符号整数 ip_dst;在 struct.unpack() 中使用 's' 代替 'I' 作为格式说明符,以便稍后可以将结果馈送到 socket.inet_ntoa() 以获取实际 IP 地址格式的 IP 地址。与以太网头的情况类似。我们在 struct.unpack() 中使用“s”而不是“B”,因为我们需要一个字符串,稍后可以将该字符串提供给 binascii.hexlify()
以获取实际 MAC 地址格式的 MAC .
关于python - 关于 python 中的 struct.unpack(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20768107/
我有一个数组 items[] items[] 中的每一项都是一个结构体。 item 有键 id、date、value(即 item.id、item.date、item.value) 我想使用 Stru
我想存储 100 名员工。 RollNo,姓名,工资,时间(各种数据,我无法在这里解释,但你可以看下面的代码片段来理解 main() { struct day { int hour
这个问题在这里已经有了答案: storage size of ‘names’ isn’t known (3 个答案) 关闭 5 年前。 我正在尝试蓝牙编程,遇到了这个我不明白的问题。基本上,当我使用
这是一个奇怪的事情: 我有一个结构,它包含指向相同类型结构的指针和指向其他类型结构的指针,以及一些其他值。 struct animal { struct animal * father;
我有一个结构定义如下(名称不同) struct str1 { int field1; struct str2; } 我在一个函数中有一个*str1。我想要一个指向 str2 的指针。 所以
DISK_DETECTION_INFO is defined as有什么原因吗? typedef struct _DISK_DETECTION_INFO { DWORD Size
我正在尝试打包一个字符串和一个字符串的长度。 fmt = '
我在创建结构时遇到问题。 我的结构: public struct Device: Codable { let data: DeviceData let meta: Meta? } pu
struct Item { var name:String? var type:String? var value:Int? var tag:Int? } ... ..
// NewReaderSize returns a new Reader whose buffer has at least the specified 43 // size. If the ar
这个问题在这里已经有了答案: Sorting a vector of custom objects (14 个答案) 关闭 3 年前。 在下面的 C++ 片段中, 如何基于 TwoInts 结构中的
#include struct Header { unsigned long long int alignment; }; int main(void) { struct Heade
我有一个目前看起来像这样的结构(缩写为仅显示基本部分): typedef struct { uint32_t baudrate; ... some other internally u
对此没有太多解释,这就是我所拥有的: public struct PACKET_HEADER { public string computerIp; publi
我有以下代码: struct MyStruct{ data: &'a str, } fn get(S: &'a MyStruct) -> &'a str{ S.data } fn se
struct S1 { char c; int i; }; struct S3 { char c1; struct S1 s; double c2; }; 我正
我有一个名为 Parameter 的协议(protocol): protocol Parameter { var name: String { get } var unit: Unit
有 2 个 struct 定义 A 和 A。我知道 struct A 可以包含指向 struct A 的 POINTER 但我不明白为什么 struct A 不能包含struct A(不是指针) 最佳
我有以下代码: struct MyStruct{ data: &'a str, } fn get(S: &'a MyStruct) -> &'a str{ S.data } fn se
为了说明这一点,这里有一个小的不可变结构和一个更新它的函数: (struct timeseries (variable observations) #:transparent) (define (ad
我是一名优秀的程序员,十分优秀!