この質問は基本的に私の他の質問の後半です 質問
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;
}