Python 从 c# 转换从 4/5 字节帧计算 CRC8
Python converting from c# Calculating CRC8 from 4/5 bytes frame
我有一个这样的框架构建:{0x00, 0x00, 0x00, 0x00, 0x00}.
计算crc8
的C#脚本
u8 Crc(u8 *buffer, u8 length)
{
u8 crc = 0, idx;
while ( length-- != 0 )
{
crc = crc ^ *buffer++;
for ( idx = 0; idx < 8; ++idx )
{
if ( crc & 0x01 ) crc = (crc >> 1) ^ 0x8C;
else crc >>= 1;
}
}
return crc;
}
有人可以告诉我如何在 Python 中正确书写吗?
您链接的网站似乎使用与您发布的网站相同的算法。转换为 Python 很容易,所有位旋转代码都保持不变,您需要更改的只是在输入缓冲区上循环的代码。
def crc8(buff):
crc = 0
for b in buff:
crc ^= b
for i in range(8):
if crc & 1:
crc = (crc >> 1) ^ 0x8C
else:
crc >>= 1
return crc
buff = [0x12, 0xAB, 0x34]
crc = crc8(buff)
print(hex(crc))
输出
0x17
如果 buff
是 bytes
或 bytearray
对象,此代码也能正常工作。
我有一个这样的框架构建:{0x00, 0x00, 0x00, 0x00, 0x00}.
计算crc8
的C#脚本 u8 Crc(u8 *buffer, u8 length)
{
u8 crc = 0, idx;
while ( length-- != 0 )
{
crc = crc ^ *buffer++;
for ( idx = 0; idx < 8; ++idx )
{
if ( crc & 0x01 ) crc = (crc >> 1) ^ 0x8C;
else crc >>= 1;
}
}
return crc;
}
有人可以告诉我如何在 Python 中正确书写吗?
您链接的网站似乎使用与您发布的网站相同的算法。转换为 Python 很容易,所有位旋转代码都保持不变,您需要更改的只是在输入缓冲区上循环的代码。
def crc8(buff):
crc = 0
for b in buff:
crc ^= b
for i in range(8):
if crc & 1:
crc = (crc >> 1) ^ 0x8C
else:
crc >>= 1
return crc
buff = [0x12, 0xAB, 0x34]
crc = crc8(buff)
print(hex(crc))
输出
0x17
如果 buff
是 bytes
或 bytearray
对象,此代码也能正常工作。