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