Python处理网络帧等字节文件——CRC8校验

#!/usr/bin/python
# -*- coding: utf-8 -*-


def crc8(line_):
    # 转换成010101的形式,加上'f'再去掉前面6位是怕前面的0x0被忽略,另外还要去掉'0b'
    line_ = bin(int('f' + line_, 16))[6:]
    # print line_
    reg = 0
    for bit in line_:
        if reg & 0x80 != 0:
            reg <<= 1
            # 下面一行代码是为了控制reg最多只有8bit
            reg &= 0xff
            if bit == '1':
                reg += 1
                reg &= 0xff
            reg ^= 0x07
        else:
            reg <<= 1
            reg &= 0xff
            if bit == '1':
                reg += 1
                reg &= 0xff
        # print reg
        # break
    return reg & 0xff


# 需要读取的数据帧,里面用二进制打开是"aaaaaaaaaaab00000463adc"这种形式
filename = "ch03_mac_frame_data"
content = ""
with open(filename, "rb") as f:
    while True:
        # 每次以二进制读取一个字节(注意是读取的字节!!),转换成16进制的形式
        c = f.read(1)
        if not c:
            break
        byte = hex(ord(c))
        # 把0x8这种形式转换成0x08这种展开式
        if len(byte) == 3:
            # print 'original byte:', byte
            byte = '0x0' + byte[2]
        # print byte
        # 去除前面的0x
        content += byte[2:4]
        # print type(hex(ord(c)))

# print content

# 分离以太网数据帧,aaaaaaaaaaaaaaab是以太网帧头标志
result = content.split("aaaaaaaaaaaaaaab")[1:5]
# print len(result)
for line in result:
    #每行都是一个数据帧(示例格式的以太网数据帧没有表示长度的部分,是非标准格式,不需要care)
    print
    # print line
    # 进行crc-8校验
    print "进行crc-8校验:"
    if crc8(line) != 0:
        print "此数据帧出错!"
    else:
        print "此数据帧校验无误!"
    print "目的MAC地址:", line[0:12]
    print "源MAC地址:", line[12:24]
    print "类型:", line[24:28]
    # 把"aaaa"这样的字符串转换成文本,ascii编码
    text = line[28:len(line) - 4]
    real_text = ""
    for i in range(0, len(text), 2):
        # text是16进制形式的字符串,如"aaad16b6",每次取两个字符,如"aa",转换成数字,再用chr()函数查找ascii表即可找出它代表的字符
        cc = int(text[i:i + 2], 16)
        character = chr(cc)
        real_text += character
    print "内容:", real_text
    print "FCS:", line[len(line) - 4:len(line)]

主要需要注意的是bin()chr()ord()hex()这些函数的使用。

你可能感兴趣的:(Python处理网络帧等字节文件——CRC8校验)