0

Intelメソッドを使用してファイルcrc(c ++)を計算したいと思います。私はこれをhttp://create.stephan-brumme.com/crc32/(Slicing-by-8 )で見つけました。しかし、この実装はintでcrc32を返しますが、一部のライブラリ(たとえば、cryptopp)のようにunsignedchar[4]でcrc32を取得したいと思います。どうすればこれを行うことができますか?よろしく

4

4 に答える 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 に答える