2015-10-15 98 views
-5

我需要将此CRC32算法转换为python(使用3.3),但我是一个python noob。我试过建立在binascii.crc32()中,但CRC不正确。显然,STMicro做的CRC32有点不同。我发现了一种可行的算法,现在我只需要它在python中。将此CRC32算法转换为Python 3.3

//**************************************************************************** 

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); 
} 
+5

由于这不是代码翻译服务 – jonrsharpe

+2

我正在投票结束这个题目,因为它不是代码翻译服务。我建议在python关闭之前快速粘贴你的努力。 – eleanora

+0

@eleanora无需匆忙;如果OP在暂挂状态下对其进行编辑,它将自动碰撞到重新打开队列以供审阅。 – jonrsharpe

回答

0

如果我的理解是没有错的话,这应该是代码,你想:

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): 
    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], 'big') 
     crc = crc32_fast(crc, data) 
    return crc 

功能crc32_fast_block预计初始crc值和数字的迭代上运行的算法。 crc32_fast_bytes几乎相同,但预计值为bytes,长度为四的倍数。

+1

This Works!我知道我有些要求翻译,但我非常感谢你的帮助! – eyesonly760