将此CRC32算法转换为Python 3.3
我需要将这个CRC32算法转换为python(使用3.3),但我是一个python noob。我尝试了内置的binasci.crc32(),但是CRC不正确。显然,意法半导体的CRC32有点不同。我发现了一个有效的算法,现在我只需要它在python中将此CRC32算法转换为Python 3.3,python,algorithm,crc,crc32,Python,Algorithm,Crc,Crc32,我需要将这个CRC32算法转换为python(使用3.3),但我是一个python noob。我尝试了内置的binasci.crc32(),但是CRC不正确。显然,意法半导体的CRC32有点不同。我发现了一个有效的算法,现在我只需要它在python中 //**************************************************************************** DWORD Crc32Fast(DWORD Crc, DWORD Data) { s
//****************************************************************************
DWORD Crc32Fast(DWORD Crc, DWORD Data)
{
static const DWORD CrcTable[16] = { // Nibble lookup table for 0x04C11DB7 polynomial
0x00000000,0x04C11DB7,0x09823B6E,0x0D4326D9,0x130476DC,0x17C56B6B,0x1A864DB2,0x1E475005,
0x2608EDB8,0x22C9F00F,0x2F8AD6D6,0x2B4BCB61,0x350C9B64,0x31CD86D3,0x3C8EA00A,0x384FBDBD };
Crc = Crc ^ Data; // Apply all 32-bits
// Process 32-bits, 4 at a time, or 8 rounds
Crc = (Crc << 4) ^ CrcTable[Crc >> 28]; // Assumes 32-bit reg, masking index to 4-bits
Crc = (Crc << 4) ^ CrcTable[Crc >> 28]; // 0x04C11DB7 Polynomial used in STM32
Crc = (Crc << 4) ^ CrcTable[Crc >> 28];
Crc = (Crc << 4) ^ CrcTable[Crc >> 28];
Crc = (Crc << 4) ^ CrcTable[Crc >> 28];
Crc = (Crc << 4) ^ CrcTable[Crc >> 28];
Crc = (Crc << 4) ^ CrcTable[Crc >> 28];
Crc = (Crc << 4) ^ CrcTable[Crc >> 28];
return(Crc);
}
//****************************************************************************
DWORD Crc32FastBlock(DWORD Crc, DWORD Size, DWORD *Buffer) // 32-bit units
{
while(Size--)
Crc = Crc32Fast(Crc, *Buffer++);
return(Crc);
}
//****************************************************************************
DWORD Crc32Fast(DWORD Crc,DWORD数据)
{
静态常量DWORD CrcTable[16]={//0x04C11DB7多项式的半字节查找表
0x00000000,0x04C11DB7,0x09823B6E,0x0D4326D9,0x130476DC,0x17C56B,0x1A864DB2,0x1E475005,
0x2608EDB8、0x22C9F00F、0x2F8AD6D6、0x2B4BCB61、0x350C9B64、0x31CD86D3、0x3C8EA00A、0x384FBDBD};
Crc=Crc^Data;//应用所有32位
//处理32位,每次4位,或8轮
Crc=(Crc>28];//假定为32位reg,屏蔽索引为4位
Crc=(Crc>28];//STM32中使用的0x04C11DB7多项式
Crc=(Crc>28];
Crc=(Crc>28];
Crc=(Crc>28];
Crc=(Crc>28];
Crc=(Crc>28];
Crc=(Crc>28];
返回(Crc);
}
//****************************************************************************
DWORD Crc32FastBlock(DWORD Crc、DWORD大小、DWORD*缓冲区)//32位单元
{
而(大小--)
Crc=Crc32Fast(Crc,*Buffer++);
返回(Crc);
}
如果我的理解没有错,这应该是您想要的代码:
CRC_TABLE = (0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9,
0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E475005,
0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61,
0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD)
def dword(value):
return value & 0xFFFFFFFF
def crc32_fast(crc, data):
crc, data = dword(crc), dword(data)
crc ^= data
for _ in range(8):
crc = dword(crc << 4) ^ CRC_TABLE[crc >> 28]
return crc
def crc32_fast_block(crc, buffer):
for data in buffer:
crc = crc32_fast(crc, data)
return crc
def crc32_fast_bytes(crc, bytes_data, byteorder='big'):
if len(bytes_data) & 3:
raise ValueError('bytes_data length must be multiple of four')
for index in range(0, len(bytes_data), 4):
data = int.from_bytes(bytes_data[index:index+4], byteorder)
crc = crc32_fast(crc, data)
return crc
CRC\u表=(0x00000000、0x04C11DB7、0x09823B6E、0x0D4326D9、,
0x130476DC、0x17C56B6B、0x1A864DB2、0x1E475005、,
0x2608EDB8、0x22C9F00F、0x2F8AD6D6、0x2B4BB61、,
0x350C9B64、0x31CD86D3、0x3C8EA00A、0x384FBDBD)
def dword(值):
返回值&0xFFFFFFFF
def crc32_fast(crc,数据):
crc,数据=dword(crc),dword(数据)
crc^=数据
对于范围(8)内的uu:
crc=dword(crc>28)
返回crc
def crc32_快速_块(crc,缓冲器):
对于缓冲区中的数据:
crc=crc32_快速(crc,数据)
返回crc
def crc32快速字节(crc,字节数据,字节顺序='big'):
如果len(字节数)&3:
raise VALUERROR('字节\数据长度必须是四的倍数')
对于范围内的索引(0,len(字节\数据),4):
data=int.from_字节(字节数据[索引:索引+4],字节顺序)
crc=crc32_快速(crc,数据)
返回crc
函数
crc32\u fast\u block
需要一个初始crc
值和一组数字来运行算法。crc32\u fast\u bytes
几乎相同,但需要一个长度为四倍的bytes
值。我投票结束这个问题,因为这不是一个代码转换我建议您在python关闭之前尽快将其粘贴到python中。@eleanora无需匆忙;如果OP在其被搁置后对其进行编辑,它将自动跳转到重新打开队列中进行审阅。这很有效!我知道我曾因要求翻译而受到批评,但我真的非常感谢您的帮助!“big”可能应该是'little'@davidechner一个更好的解决方案是提供一个参数来指定数字的存储方式。谢谢你的建议!代码已经修改为支持任何一个选项。