18

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

ループなしでエンディアンの問題を回避して、UINT16 値を UINT8 * 配列に変換するにはどうすればよいですか。

基本的に私はこのようなことをしたい:

UINT16 value = 0xAAFF;
UINT8 array[2] = value;

これの最終結果は、エンディアン変換を回避しながら、値を UINT8 配列に格納することです。

UINT8 * mArray;
memcpy(&mArray[someOffset],&array,2);

UINT16 値を使用して単に memcpy を実行すると、リトルエンディアンに変換され、出力が台無しになります。エンディアン変換関数の使用を避けようとしていますが、運が悪いだけかもしれません。

4

6 に答える 6

45

どうですか

UINT16 value = 0xAAFF;
UINT8 array[2];
array[0]=value & 0xff;
array[1]=(value >> 8);

これにより、エンディアンに関係なく同じ結果が得られるはずです。

または、配列初期化子を使用する場合:

UINT8 array[2]={ value & 0xff, value >> 8 };

value(ただし、これはが定数の場合にのみ可能です。)

于 2009-08-17T17:38:37.923 に答える
8

条件付きコンパイルは必要ありません。ビットシフトして、値の上位バイトと下位バイトを取得できます。

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 }

キャストはオプションです。

于 2009-08-17T17:34:27.883 に答える
6

配列の下位バイトの上に上位バイトを置きたいと仮定します。

array[0] = value & 0xff;
array[1] = (value >> 8) & 0xff;
于 2009-08-17T17:40:25.780 に答える
1
union TwoBytes
{
    UINT16 u16;
    UINT8 u8[2];
};

TwoBytes Converter;
Converter.u16 = 65535;
UINT8 *array = Converter.u8;
于 2009-08-17T17:47:42.630 に答える
0

UINT16 *への一時的なキャストはそれを行う必要があります:

((UINT16*)array)[0] = value;
于 2009-08-17T17:26:18.790 に答える