我有一个Python函数,用于解压以太网帧:
def ethernet_frame(data):
ipheader = struct.unpack('!6s6sH', data[0:14])
dest_mac = binascii.hexlify(ipheader[0])
src_mac = binascii.hexlify(ipheader[1])
proto = ""
protoType = ipheader[2]
nextProto = hex(protoType)
print(nextProto)
if(nextProto == '0x800'):
proto = 'IPV4'
elif(nextProto == '0x86dd'):
proto = 'IPV6'
print(nextProto)
return dest_mac, src_mac, proto, data[14:]
我希望IPV4得到0x800,IPV6得到0x86dd。 但在打开框架后,我得到了0xc0a8。 有人能解释为什么我会得到这些意想不到的数据吗?如何修复它以获得正确的数据
听起来您可能正在将IP报头作为以太网报头读取}是(192168),在我看来,它就像内部IP地址192.168.x.x的前两个字节
0x0800
是以太网报头的最后两个字节data[12:13]
。IP头前置地址的长度为12字节,接下来的两个字节(IP_头[12:13])是IP源地址的前两个字节^十进制的{(IIRC),IP报头直接嵌入在图表的黄色数据段中的以太网报头之后,因此,例如,如果您尝试读取第一个以太网报头之后的第二个以太网报头,则可能会发生这种情况
(顺便说一句,您不需要将
protoType
转换为字符串以将其与十六进制值进行比较,您只需执行if protoType == 0x0800
/elif protoType == 0x86dd
)相关问题 更多 >
编程相关推荐