python实现crc16算法

本文用python实现crc16算法,crc算法包含两种:

       1、直接计算法;

       2、查表法。

本文以多项式x16 + x12 + x5 + x1 (0x1021)为例计算crc16,以下分别实现这两种方法:

1、直接计算法

        直接计算法是根据多项式按位计算出crc16,方法直接,但是速度慢,以下为具体代码:

def crc16_direct(bytestr):
    '''
    crc16直接计算法
    :param bytestr: bytes字符串
    :return: int16类型
    '''
    crc = 0
    if len(bytestr) == 0:
        return 0
    for i in range(len(bytestr)):
        R = bytestr[i]
        for j in range(8):
            if R > 127:
                k = 1
            else:
                k = 0
                
            R = (R << 1) & 0xff
            if crc > 0x7fff:
                m = 1
            else:
                m = 0

            if k + m == 1:
                k = 1
            else:
                k = 0

            crc = (crc << 1) & 0xffff
            if k == 1:
                crc ^= 0x1021  # 多项式为 0x1021
    return crc

2、查表法

      查表法是按照字节计算crc16,相较于直接计算法,速度更快。

      查表法首先需要生成长度为256的字节表,生成字节表算法如下:


def init_crc16_tables(poly):
    re_crc16 = []
    for i in range(256):
        accum = (i << 8) & 0xFFFF
        for j in range(7, -1, -1):
            if (accum & 0x8000) != 0:
                accum = ((accum << 1) & 0xFFFF) ^ poly
            else:
                accum = accum << 1
        re_crc16.append(accum)
    return re_crc16

crc16_table = init_crc16_tables(0x1021)

      如已知字节表内容,也可直接写入:

mCRC16_Tables = [0, 4129, 8258, 12387, 16516, 20645, 24774, 28903, 33032, 37161, 41290, 45419, 49548, 53677, 57806,
                 61935, 4657, 528, 12915, 8786, 21173, 17044, 29431, 25302, 37689, 33560, 45947, 41818, 54205, 50076,
                 62463, 58334, 9314, 13379, 1056, 5121, 25830, 29895, 17572, 21637, 42346, 46411, 34088, 38153, 58862,
                 62927, 50604, 54669, 13907, 9842, 5649, 1584, 30423, 26358, 22165, 18100, 46939, 42874, 38681, 34616,
                 63455, 59390, 55197, 51132, 18628, 22757, 26758, 30887, 2112, 6241, 10242, 14371, 51660, 55789, 59790,
                 63919, 35144, 39273, 43274, 47403, 23285, 19156, 31415, 27286, 6769, 2640, 14899, 10770, 56317, 52188,
                 64447, 60318, 39801, 35672, 47931, 43802, 27814, 31879, 19684, 23749, 11298, 15363, 3168, 7233, 60846,
                 64911, 52716, 56781, 44330, 48395, 36200, 40265, 32407, 28342, 24277, 20212, 15891, 11826, 7761, 3696,
                 65439, 61374, 57309, 53244, 48923, 44858, 40793, 36728, 37256, 33193, 45514, 41451, 53516, 49453,
                 61774, 57711, 4224, 161, 12482, 8419, 20484, 16421, 28742, 24679, 33721, 37784, 41979, 46042, 49981,
                 54044, 58239, 62302, 689, 4752, 8947, 13010, 16949, 21012, 25207, 29270, 46570, 42443, 38312, 34185,
                 62830, 58703, 54572, 50445, 13538, 9411, 5280, 1153, 29798, 25671, 21540, 17413, 42971, 47098, 34713,
                 38840, 59231, 63358, 50973, 55100, 9939, 14066, 1681, 5808, 26199, 30326, 17941, 22068, 55628, 51565,
                 63758, 59695, 39368, 35305, 47498, 43435, 22596, 18533, 30726, 26663, 6336, 2273, 14466, 10403, 52093,
                 56156, 60223, 64286, 35833, 39896, 43963, 48026, 19061, 23124, 27191, 31254, 2801, 6864, 10931, 14994,
                 64814, 60687, 56684, 52557, 48554, 44427, 40424, 36297, 31782, 27655, 23652, 19525, 15522, 11395, 7392,
                 3265, 61215, 65342, 53085, 57212, 44955, 49082, 36825, 40952, 28183, 32310, 20053, 24180, 11923,
                 16050, 3793, 7920]

      计算crc结果算法如下:

def crc16_table(bytestr):
    '''
    crc16查表法
    :param bytestr: bytes字符串
    :return: int16类型
    '''
    crc = 0x0000
    data = bytearray(bytestr)
    len1 = len(bytestr)
    for i in range(len1):
        cp = (crc >> 8) ^ data[i]
        crc = ((crc << 8) & 0xFFFF) ^ mCRC16_Tables[cp]
    return crc

3、使用demo

      直接上代码:

bytestr = b'This is test string.'
crc16 = crc16_direct(bytestr)  # 直接计算法
print("直接及算法:", crc16)
crc16 = crc16_table(bytestr)  # 查表法
print("查表法:", crc16)

结果为:

猜你喜欢

转载自blog.csdn.net/tww124849980/article/details/124894834