Внедрение Intel CRC32

Я хочу использовать метод Intel для расчета файла CRC (в C ++). я нашел это http://create.stephan-brumme.com/crc32/ (Нарезка-на-8). Но эта реализация возвращает мне crc32 в int, но я хочу получить crc32 в unsigned char [4], как в некоторых библиотеках (например, cryptopp). Любая идея, как я могу это сделать?
С уважением

0

Решение

Вы конвертируете свой 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> применимо.

2

Другие решения

с чем-то вроде этого вы можете конвертировать, но это зависит от маленьких / больших порядковых номеров и от того, насколько велики ваши intы.

#pragma pack(1)

#include <cstdint>

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

} crc;

crc.crc32 = yourcrc();

crc.crc4[0...3]
2

Простой код для байтов

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

Для Big Endian просто наоборот

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

Предполагая, что ваш int 32-битный:

unsigned int i = 0x12345678;

little endian:

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

big endian:

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
0
По вопросам рекламы [email protected]