【问题标题】:Convert this CRC32 algorithm to Python 3.3将此 CRC32 算法转换为 Python 3.3
【发布时间】:2015-10-15 15:01:59
【问题描述】:

我需要将此 CRC32 算法转换为 python(使用 3.3),但我是 python 菜鸟。我尝试了内置的 binascii.crc32(),但 CRC 不正确。显然,STMicro 的 CRC32 有点不同。我找到了一个可行的算法,现在我只需要它在 python 中。

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

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

【问题讨论】:

  • 我投票结束这个问题,因为这不是代码翻译服务

标签: python algorithm crc crc32


【解决方案1】:

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

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

函数crc32_fast_block 需要一个初始的crc 值和一个可迭代的数字来运行算法。 crc32_fast_bytes 几乎相同,但需要一个长度为四的倍数的 bytes 值。

【讨论】:

  • “大”应该是“小”
  • @DavidLechner 一个更好的解决方案是提供一个参数来指定数字的存储方式。感谢您的建议!代码已修改为支持任一选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
  • 2011-02-09
  • 1970-01-01
  • 2013-12-31
相关资源
最近更新 更多