2017-09-07 13 views
1

バイト配列のSTM crc32を計算する関数があります。問題は、5120バイトの配列では20ミリ秒かかることです。これは間違いなく長すぎます。このコードの速度を向上させるオプションがあります。最大値は約5msですか?Pythonコード/ STM CRC32関数の改良

コード:

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 
+0

あなたは 'binascii.crc32'関数を使ってみましたか?あなたが署名されているかどうかわからない場合、その関数は署名付きで、unsignedにする: 'crc32 = binascii.crc32(data)%(1 << 32) –

+0

binasciiはstm crcではない。 binasciiまたはzlibを使用してください – KyluAce

+0

テーブルには何がありますか? –

答えて

1

あなたは、Pythonから呼び出してコンパイルしてCコードを生成するためにcrcmodを使用することができます。これは、Pythonコードよりもはるかに高速です。

+0

そしてSTM crcは計算されますか? – KyluAce

+1

私はそれを使用する前にそれをチェックし、それは私にstm以外のcrcを与えます – KyluAce

+0

RTFM。 CRCパラメータを指定します。これは、8の倍数と<= 64(32を含む)の長さの_any_CRCのコードを生成することができます。 –

関連する問題