Python中unpack('!6s6sH', bytes())参数含义及作用说明
struct.unpack('!6s6sH', bytes(eth_header))格式参数详解 这行代码是Python标准库struct模块用于解析以太网帧头的典型用法,格式字符串!6s6sH的每段含义拆分如下:
!:字节序标识,指定按照**网络字节序(大端序)**解析二进制数据。所有网络协议传输的二进制数据默认采用大端序,加这个标识可以避免不同主机自身字节序差异导致的解析错误。- 第一个
6s:表示连续读取6字节长度的原始字节串,对应以太网帧头的第一个字段——目的MAC地址,MAC地址固定为6字节长度,s类型不会将数据转为整数,会直接返回bytes类型值。 - 第二个
6s:同样读取6字节长度的原始字节串,对应以太网帧头的第二个字段——源MAC地址。 - 末尾的
H:表示读取2字节长度的无符号短整型数,对应以太网帧头的第三个字段——帧类型,解析后会直接返回整数,比如值为2048(对应十六进制0x0800)时代表上层是IPv4协议,值为2054(0x0806)时代表上层是ARP协议。
总长度校验:整个格式串对应的解析总长度为6+6+2=14字节,正好匹配标准以太网帧头的固定长度,执行unpack后会返回一个长度为3的元组,顺序对应「目的MAC字节串、源MAC字节串、帧类型整数」。
示例返回值参考:
import struct # 模拟14字节以太网帧头 mock_eth_header = b'\xaa\xbb\xcc\xdd\xee\xff\x11\x22\x33\x44\x55\x66\x08\x00' result = struct.unpack('!6s6sH', mock_eth_header) # 输出结果:(b'\xaa\xbb\xcc\xdd\xee\xff', b'\x11\x22\x33\x44\x55\x66', 2048)
内容的提问来源于stack exchange,提问作者D-LA
相关产品推荐
相关产品推荐

