我试图基于CRC-16算法评估适当的校验和,使用crcmod Python模块和2.7版本的crcmod解释器。校验和参数是:
代码:
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
,这是正确的(相对于订单)。
发布于 2016-02-05 15:50:12
crcmod
工作很好。你没有给它你认为你要给它的三个字节。您的str(int(0x5A0001))
提供了七个字节,它们是ASCII字符5898241
--将0x5a0001
转换为十进制。
要将字节0x5a 0x00 0x01
提供给它,您可以选择(作为一种方法):
print hex(crc16("5a0001".decode("hex")))
打印0xace
。
发布于 2019-04-25 13:31:22
以下是CRC-16/CCITT-FALSE的python实现
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
发布于 2020-03-09 15:56:11
基于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
https://stackoverflow.com/questions/35205702
复制相似问题