質問

値を保持するs_intと呼ばれる短い整数変数があります= 2

unsighed short s_int = 2;

この番号をCharアレイにコピーして、チャーアレイの最初と2番目の位置にコピーしたいと思います。

私たちが持っているとしましょう char buffer[10];. 。の2バイトが必要です s_int でコピーされます buffer[0]buffer[1].

どうすればできますか?

役に立ちましたか?

解決

これを行う通常の方法は、ビットワイズ演算子が一度にバイトをスライスしてサイコロしていることです。

b[0] = si & 0xff;
b[1] = (si >> 8) & 0xff;

ただし、これは本当に行われるべきです unsigned char, 、平野ではありません char それらはほとんどのシステムで署名されているため。

大きな整数を保存することは、同様の方法で、またはループで実行できます。

他のヒント

*((short*)buffer) = s_int;

しかし Viator Emptor 結果として生じるバイト順序は、エンディアン性によって異なること。

ポインターとキャストを使用する。

unsigned short s_int = 2;
unsigned char buffer[sizeof(unsigned short)];

// 1.
unsigned char * p_int = (unsigned char *)&s_int;
buffer[0] = p_int[0];
buffer[1] = p_int[1];

// 2.
memcpy(buffer, (unsigned char *)&s_int, sizeof(unsigned short));

// 3.
std::copy((unsigned char *)&s_int,
          ((unsigned char *)&s_int) + sizeof(unsigned short),
          buffer);

// 4.
unsigned short * p_buffer = (unsigned short *)(buffer); // May have alignment issues
*p_buffer = s_int;

// 5.
union Not_To_Use
{
  unsigned short s_int;
  unsigned char  buffer[2];
};

union Not_To_Use converter;
converter.s_int = s_int;
buffer[0] = converter.buffer[0];
buffer[1] = converter.buffer[1];

私はそれをmemcpy、それのようなものにします

memcpy(buffer, &s_int, 2);

エンディアンネスは正しく保存されているため、バッファーを符号なしの短い *に投げ込むと、同じ値が正しい方法で読み取ることができます。その他のソリューションは、エンディアンに意識する必要があります。そうしないと、LSBとMSBを交換できます。そしてもちろん、(短い)sizeofは2でなければなりません。

あなたがすべてのビットワイズのものを作りたくないなら、あなたは次のことをすることができます

char* where = (char*)malloc(10);
short int a = 25232;
where[0] = *((char*)(&a) + 0);
where[1] = *((char*)(&a) + 1);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top