在 Python 中计算 CRC16
Calculating CRC16 in Python
我正在尝试使用 crcmod Python 模块和 Python 的 2.7 版本基于 CRC-16 算法评估适当的校验和口译员。校验和参数为:
- CRC 顺序:16
- CRC 多项式:0x8005
- 初始值:0xFFFF
- 最终值:0x0000
- 直接:正确
代码:
crc16 = crcmod.mkCrcFun(0x18005, rev=False, initCrc=0xFFFF, xorOut=0x0000)
print hex(crc16(str(int(0x5A0001))))
并且对于输入 0x5A0001
它打印 0x7E16
而我应该得到类似 0xCE0A
.
的东西
我检查了 http://www.lokker.net/Java/crc/CRCcalculation2.htm,计算值是 0xACE
,这是正确的(关于顺序)。
crcmod
工作正常。您没有给它您认为给它的三个字节。您的 str(int(0x5A0001))
提供 7 个字节,它们是 ASCII 字符 5898241
— 0x5a0001
到十进制的转换。
要向它提供字节 0x5a 0x00 0x01
,您可以改为(作为一种方法):
print hex(crc16("5a0001".decode("hex")))
打印 0xace
.
这是 python 实现 CRC-16/CCITT-FALSE
def crc16(data : bytearray, offset , length):
if data is None or offset < 0 or offset > len(data)- 1 and offset+length > len(data):
return 0
crc = 0xFFFF
for i in range(0, length):
crc ^= data[offset + i] << 8
for j in range(0,8):
if (crc & 0x8000) > 0:
crc =(crc << 1) ^ 0x1021
else:
crc = crc << 1
return crc & 0xFFFF
- data : 要计算 CRC 的数据的字节数组
- 偏移量:您要从哪个偏移量开始计算 CRC
- length : 要计算 CRC 的偏移量
def crc16(data : bytearray, offset, length):
if data is None or offset < 0 or offset > len(data) - 1 and offset + length > len(data):
return 0
print("uzunluk=", len(data))
print(data)
crc = 0xFFFF
for i in range(length):
crc ^= data[offset + i]
for j in range(8):
print(crc)
if ((crc & 0x1) == 1):
print("bb1=", crc)
crc = int((crc / 2)) ^ 40961
print("bb2=", crc)
else:
crc = int(crc / 2)
return crc & 0xFFFF
基于 pycrc 代码的 CRC-16-ANSI、CRC-16-IBM 的工作单函数示例。
易于修改,但不包括输入或输出反射功能:
def crc16(data: bytes):
xor_in = 0x0000 # initial value
xor_out = 0x0000 # final XOR value
poly = 0x8005 # generator polinom (normal form)
reg = xor_in
for octet in data:
# reflect in
for i in range(8):
topbit = reg & 0x8000
if octet & (0x80 >> i):
topbit ^= 0x8000
reg <<= 1
if topbit:
reg ^= poly
reg &= 0xFFFF
# reflect out
return reg ^ xor_out
我正在尝试使用 crcmod Python 模块和 Python 的 2.7 版本基于 CRC-16 算法评估适当的校验和口译员。校验和参数为:
- CRC 顺序:16
- CRC 多项式:0x8005
- 初始值:0xFFFF
- 最终值:0x0000
- 直接:正确
代码:
crc16 = crcmod.mkCrcFun(0x18005, rev=False, initCrc=0xFFFF, xorOut=0x0000)
print hex(crc16(str(int(0x5A0001))))
并且对于输入 0x5A0001
它打印 0x7E16
而我应该得到类似 0xCE0A
.
我检查了 http://www.lokker.net/Java/crc/CRCcalculation2.htm,计算值是 0xACE
,这是正确的(关于顺序)。
crcmod
工作正常。您没有给它您认为给它的三个字节。您的 str(int(0x5A0001))
提供 7 个字节,它们是 ASCII 字符 5898241
— 0x5a0001
到十进制的转换。
要向它提供字节 0x5a 0x00 0x01
,您可以改为(作为一种方法):
print hex(crc16("5a0001".decode("hex")))
打印 0xace
.
这是 python 实现 CRC-16/CCITT-FALSE
def crc16(data : bytearray, offset , length):
if data is None or offset < 0 or offset > len(data)- 1 and offset+length > len(data):
return 0
crc = 0xFFFF
for i in range(0, length):
crc ^= data[offset + i] << 8
for j in range(0,8):
if (crc & 0x8000) > 0:
crc =(crc << 1) ^ 0x1021
else:
crc = crc << 1
return crc & 0xFFFF
- data : 要计算 CRC 的数据的字节数组
- 偏移量:您要从哪个偏移量开始计算 CRC
- length : 要计算 CRC 的偏移量
def crc16(data : bytearray, offset, length):
if data is None or offset < 0 or offset > len(data) - 1 and offset + length > len(data):
return 0
print("uzunluk=", len(data))
print(data)
crc = 0xFFFF
for i in range(length):
crc ^= data[offset + i]
for j in range(8):
print(crc)
if ((crc & 0x1) == 1):
print("bb1=", crc)
crc = int((crc / 2)) ^ 40961
print("bb2=", crc)
else:
crc = int(crc / 2)
return crc & 0xFFFF
基于 pycrc 代码的 CRC-16-ANSI、CRC-16-IBM 的工作单函数示例。
易于修改,但不包括输入或输出反射功能:
def crc16(data: bytes):
xor_in = 0x0000 # initial value
xor_out = 0x0000 # final XOR value
poly = 0x8005 # generator polinom (normal form)
reg = xor_in
for octet in data:
# reflect in
for i in range(8):
topbit = reg & 0x8000
if octet & (0x80 >> i):
topbit ^= 0x8000
reg <<= 1
if topbit:
reg ^= poly
reg &= 0xFFFF
# reflect out
return reg ^ xor_out