Pythonはネットフレームなどのバイトファイルを処理する——CRC 8検査

6500 ワード

#!/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()これらの関数の使用です.