Intelメソッドを使用してファイルcrc(c ++)を計算したいと思います。私はこれをhttp://create.stephan-brumme.com/crc32/(Slicing-by-8 )で見つけました。しかし、この実装はintでcrc32を返しますが、一部のライブラリ(たとえば、cryptopp)のようにunsignedchar[4]でcrc32を取得したいと思います。どうすればこれを行うことができますか?よろしく
質問する
968 次
4 に答える
2
このようなもので変換できますが、それはリトルエンディアン/ビッグエンディアンとintの大きさに依存します。
#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 に答える
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 に答える
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 に答える
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 に答える