値 = 2 を保持する s_int という短い整数変数があります
unsighed short s_int = 2;
この数値を char 配列の 1 番目と 2 番目の位置に char 配列にコピーしたいと考えています。
あるとしましょうchar buffer[10];
。の 2 バイトをs_int
と にコピーしbuffer[0]
ますbuffer[1]
。
どうすればいいですか?
値 = 2 を保持する s_int という短い整数変数があります
unsighed short s_int = 2;
この数値を char 配列の 1 番目と 2 番目の位置に char 配列にコピーしたいと考えています。
あるとしましょうchar buffer[10];
。の 2 バイトをs_int
と にコピーしbuffer[0]
ますbuffer[1]
。
どうすればいいですか?
これを行う通常の方法は、ビットごとの演算子を使用して、一度に 1 バイトずつスライスしてダイスすることです。
b[0] = si & 0xff;
b[1] = (si >> 8) & 0xff;
ただし、ほとんどのシステムで署名されているため、これは実際にunsigned char
はプレーンではなくで行う必要があります。char
より大きな整数の格納は、同様の方法またはループで行うことができます。
*((short*)buffer) = s_int;
しかし、結果のバイトオーダーがエンディアンによって異なることを確認してください。
私はそれをmemcpyします
memcpy(buffer、&s_int、2);
エンディアンは正しく保持されるため、バッファをunsigned short *にキャストすると、s_intの同じ値を正しい方法で読み取ることができます。他のソリューションはエンディアンに対応している必要があります。そうでない場合は、lsbとmsbを交換できます。そしてもちろん、sizeof(short)は2でなければなりません。
ポインタとキャストを使用する。
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];
すべてのビット単位のものを作成したくない場合は、次のことができます
char* where = (char*)malloc(10);
short int a = 25232;
where[0] = *((char*)(&a) + 0);
where[1] = *((char*)(&a) + 1);