2015-10-15 145 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