CRC32英特尔实现

CRC32 intel implementation

本文关键字:实现 英特尔 CRC32      更新时间:2023-10-16

我想使用intel方法来计算文件crc(在c++中)。我找到了这个http://create.stephan-brumme.com/crc32/(切片8)。但是这个实现返回给我crc32 in int,但我想得到crc32 in unsigned char[4]像在一些库(例如cryptopp)。知道我该怎么做吗?关于

将整型转换为字节,例如:

void Uint2Uchars(unsigned char* buf, unsigned int n)
{
  memcpy(buf, &n, sizeof n);
}

或者,如果您对特定的端序感兴趣,您可以这样做:

void Uint2UcharsLE(unsigned char* buf, unsigned int n)
{
  size_t i;
  for (i = 0; i < sizeof n; i++)
  {
    buf[i] = n;
    n >>= CHAR_BIT;
  }
}

void Uint2UcharsBE(unsigned char* buf, unsigned int n)
{
  size_t i;
  for (i = 0; i < sizeof n; i++)
  {
    buf[sizeof n - 1 - i] = n;
    n >>= CHAR_BIT;
  }
}

不要忘记包括适当的标题,<string.h><limits.h>如适用

你可以这样转换,但这取决于小/大端序和你的整型数的大小。

#pragma pack(1)
#include <cstdint>
typedef union
{
  char crc4[4];
  uint32_t crc32;
} crc;
crc.crc32 = yourcrc();
crc.crc4[0...3]

小端序代码

int i = crc();
unsigned char b[4];
b[0] = (unsigned char)i;
b[1] = (unsigned char)(i >> 8);
b[2] = (unsigned char)(i >> 16);
b[3] = (unsigned char)(i >> 24);

对于大端序只需反过来

int i = crc();
unsigned char b[4];
b[3] = (unsigned char)i;
b[2] = (unsigned char)(i >> 8);
b[1] = (unsigned char)(i >> 16);
b[0] = (unsigned char)(i >> 24);

假设int为32位:

unsigned int i = 0x12345678;

小端字节序:

char c2[4] = {(i>>24)&0xFF,(i>>16)&0xFF,(i>>8)&0xFF,(char)i};

大尾数法:

char* c = (char*)&i; 
//or if you need a copy:
char c1[4];
memcpy (c1,&i,4);
//or the same as little endian but everything reversed