2017-09-07 1 views
1

바이트 배열의 STM crc32를 계산하는 기능이 있습니다. 문제는 5120 바이트 배열의 경우 20 밀리 초가 소요된다는 것입니다. 이 코드의 속도를 향상시킬 수있는 옵션이 있습니다. 최대 값은 약 5ms입니까?파이썬 코드/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가 아닌 stc crc를 준다. binascii 또는 zlib 사용 – KyluAce

+0

테이블에 무엇이 있습니까? –

답변

1

당신은 당신이 파이썬에서 호출 한 후 컴파일하고 C 코드를 생성하는 crcmod를 사용할 수 있습니다. 이는 파이썬 코드보다 훨씬 빠른 속도입니다.

+0

그리고 STM crc가 계산됩니까? – KyluAce

+1

좋아, 내가 그것을 사용하기 전에 그것을 확인하고 다른 crc stm 아니 – KyluAce

+0

RTFM을 제공합니다. CRC 매개 변수를 제공합니다. 8의 배수와 <= 64 (32를 포함) 인 길이의 _any_ CRC에 대한 코드를 생성 할 수 있습니다. –