質問
この質問は基本的に私の他の後半です 質問
UINT16値をループなしでUINT8 *配列に変換し、エンディアンの問題を回避するにはどうすればよいですか。
基本的に私はこのようなことをしたい:
UINT16 value = 0xAAFF;
UINT8 array[2] = value;
これの最終結果は、エンディアン変換を避けながら、値をUINT8アレイに保存することです。
UINT8 * mArray;
memcpy(&mArray[someOffset],&array,2);
UINT16値でMemcpyを使用すると、出力を台無しにするリトルエンディアンに変換されます。私はエンディアン変換機能の使用を避けようとしていますが、私はただ運が悪いかもしれないと思います。
解決
どうですか
UINT16 value = 0xAAFF;
UINT8 array[2];
array[0]=value & 0xff;
array[1]=(value >> 8);
これは、エンディアンネスとは無関係に同じ結果をもたらすはずです。
または、配列初期剤を使用する場合:
UINT8 array[2]={ value & 0xff, value >> 8 };
(ただし、これは可能な場合にのみ可能です value
定数です。)
他のヒント
条件付き編集は必要ありません。ビットシフトして、値のより高いバイトと低いバイトを取得できます。
uint16_t value = 0xAAFF;
uint8_t hi_lo[] = { (uint8_t)(value >> 8), (uint8_t)value }; // { 0xAA, 0xFF }
uint8_t lo_hi[] = { (uint8_t)value, (uint8_t)(value >> 8) }; // { 0xFF, 0xAA }
キャストはオプションです。
配列内の低次バイトの上に高次バイトを持ちたいと仮定します。
array[0] = value & 0xff;
array[1] = (value >> 8) & 0xff;
union TwoBytes
{
UINT16 u16;
UINT8 u8[2];
};
TwoBytes Converter;
Converter.u16 = 65535;
UINT8 *array = Converter.u8;
UINT16*への一時的なキャストはそれを行う必要があります:
((UINT16*)array)[0] = value;
このスレッドを使用して、多くのサイズの配列にまたがるソリューションを開発しました。
UINT32 value = 0xAAFF1188;
int size = 4;
UINT8 array[size];
int i;
for (i = 0; i < size; i++)
{
array[i] = (value >> (8 * i)) & 0xff;
}
所属していません StackOverflow