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. 데모 사용

      코드로 바로 이동:

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

결과는 다음과 같습니다.

 

 

Supongo que te gusta

Origin blog.csdn.net/tww124849980/article/details/124894834
Recomendado
Clasificación