質問

この質問は基本的に私の他の後半です 質問

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;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top