改进Python代码/ STM CRC32功能



我具有计算字节数组的STM CRC32的功能。问题在于,对于5120字节阵列,肯定需要20ms,这肯定太长了。有一个可以提高此代码速度的选项,它可能需要大约5毫秒?

代码:

def crc32_stm(bytes_arr):
    length = len(bytes_arr)
    crc = 0xffffffff
    k = 0
    while length >= 4:
        v = ((bytes_arr[k] << 24) & 0xFF000000) | ((bytes_arr[k+1] << 16) & 0xFF0000) | 
        ((bytes_arr[k+2] << 8) & 0xFF00) | (bytes_arr[k+3] & 0xFF)
        crc = ((crc << 8) & 0xffffffff) ^ custom_crc_table[0xFF & ((crc >> 24) ^ v)]
        crc = ((crc << 8) & 0xffffffff) ^ custom_crc_table[0xFF & ((crc >> 24) ^ (v >> 8))]
        crc = ((crc << 8) & 0xffffffff) ^ custom_crc_table[0xFF & ((crc >> 24) ^ (v >> 16))]
        crc = ((crc << 8) & 0xffffffff) ^ custom_crc_table[0xFF & ((crc >> 24) ^ (v >> 24))]
        k += 4
        length -= 4
    if length > 0:
        v = 0
        for i in range(length):
            v |= (bytes_arr[k+i] << 24-i*8)
        if length == 1:
            v &= 0xFF000000
        elif length == 2:
            v &= 0xFFFF0000
        elif length == 3:
            v &= 0xFFFFFF00
        crc = (( crc << 8 ) & 0xffffffff) ^ custom_crc_table[0xFF & ( (crc >> 24) ^ (v ) )];
        crc = (( crc << 8 ) & 0xffffffff) ^ custom_crc_table[0xFF & ( (crc >> 24) ^ (v >> 8) )];
        crc = (( crc << 8 ) & 0xffffffff) ^ custom_crc_table[0xFF & ( (crc >> 24) ^ (v >> 16) )];
        crc = (( crc << 8 ) & 0xffffffff) ^ custom_crc_table[0xFF & ( (crc >> 24) ^ (v >> 24) )];
    global stmCrc
    stmCrc = crc
    return crc

您可以使用CRCMOD生成您编译的C代码,然后从Python致电。那将是比Python代码快的数量级。

最新更新