Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将此CRC32算法转换为Python 3.3_Python_Algorithm_Crc_Crc32 - Fatal编程技术网

将此CRC32算法转换为Python 3.3

将此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

我需要将这个CRC32算法转换为python(使用3.3),但我是一个python noob。我尝试了内置的binasci.crc32(),但是CRC不正确。显然,意法半导体的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);
}
//****************************************************************************
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一个更好的解决方案是提供一个参数来指定数字的存储方式。谢谢你的建议!代码已经修改为支持任何一个选项。