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