바이트 배열의 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
'binascii.crc32' 함수를 사용해 보셨습니까? 만약 당신이 부호가 있거나 부호없는 것을 원한다면 그 함수는 서명을하고 unsigned로 바꾼다 :'crc32 = binascii.crc32 (data) % (1 << 32) –
binascii는 stm crc가 아닌 stc crc를 준다. binascii 또는 zlib 사용 – KyluAce
테이블에 무엇이 있습니까? –