Python不需要数据,因为在需要0x800的类型上解包以太网帧得到0xc0a8

2024-09-27 00:13:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python函数,用于解压以太网帧:

ethernet frame

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。 有人能解释为什么我会得到这些意想不到的数据吗?如何修复它以获得正确的数据


Tags: 数据函数srcdatamacdestprotoipv6
1条回答
网友
1楼 · 发布于 2024-09-27 00:13:27

听起来您可能正在将IP报头作为以太网报头读取0x0800是以太网报头的最后两个字节data[12:13]。IP头前置地址的长度为12字节,接下来的两个字节(IP_头[12:13])是IP源地址的前两个字节^十进制的{}是(192168),在我看来,它就像内部IP地址192.168.x.x的前两个字节

(IIRC),IP报头直接嵌入在图表的黄色数据段中的以太网报头之后,因此,例如,如果您尝试读取第一个以太网报头之后的第二个以太网报头,则可能会发生这种情况

(顺便说一句,您不需要将protoType转换为字符串以将其与十六进制值进行比较,您只需执行if protoType == 0x0800/elif protoType == 0x86dd

相关问题 更多 >

    热门问题