0

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

4

4 回答 4

2

例如,您将 int 转换为字节,如下所示:

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>如果适用。

于 2013-03-20T13:17:53.553 回答
2

用这样的东西你可以转换,但这取决于小/大端和你的整数有多大。

#pragma pack(1)

#include <cstdint>

typedef union
{
  char crc4[4];
  uint32_t crc32;

} crc;

crc.crc32 = yourcrc();

crc.crc4[0...3]
于 2013-03-20T13:19:32.227 回答
0

假设您的 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
于 2013-03-20T13:27:20.967 回答
0

小端的简单代码

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);
于 2013-03-20T13:25:37.390 回答