-
-
Save oysstu/68072c44c02879a2abf94ef350d1c7c6 to your computer and use it in GitHub Desktop.
def crc16(data: bytes, poly=0x8408): | |
''' | |
CRC-16-CCITT Algorithm | |
''' | |
data = bytearray(data) | |
crc = 0xFFFF | |
for b in data: | |
cur_byte = 0xFF & b | |
for _ in range(0, 8): | |
if (crc & 0x0001) ^ (cur_byte & 0x0001): | |
crc = (crc >> 1) ^ poly | |
else: | |
crc >>= 1 | |
cur_byte >>= 1 | |
crc = (~crc & 0xFFFF) | |
crc = (crc << 8) | ((crc >> 8) & 0xFF) | |
return crc & 0xFFFF |
kjm1102
commented
Apr 27, 2023
via email
420B is returned by this particular variant of crc16 if you feed it with b'45377 So if you can figure out the connection between that & your list you're good to go. Unfortunately nothing obvious comes to mind.
…
Well converting it from binary to hexadecimal it’s 0x92 and according to https://crccalc.com/ that should return 420B for CRC-16-CCITT-FALSE. If that is a different one than the above code, how can i change the code for this variant that i need?
return('{:04X}'.format(crc))
Thanks, it works. Is there a better way to convert the list to be in a suitable format than this ChatGPT suggestion? (i'm very new to python)
bits_string = ''.join(str(bit) for bit in input_list)
int_value = int(bits_string, 2)
hex_value = hex(int_value)
hex_string = hex_value.replace('0x', '0x0') if len(hex_value) % 2 == 1 else hex_value
hex_value = bytes.fromhex(hex_string[2:])
crc=crc16(hex_value)
@pragma31 if I have a payload like this : " 623e0200000000000000000000000000" where 623e is crc given by a software i want to verify it , so what should i pass to get this value to the function that you have written here crc16 , thanks
same if i want to use https://crccalc.com/