web-dev-qa-db-ja.com

UINT16値をUINT8配列に変換する[2]

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

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

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

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

この結果、エンディアン変換を回避しながら、値をUINT8配列に格納します。

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

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

14
dp.

どうですか

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

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

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

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

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

30
Martin B

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

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 }

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

7
Christoph

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

array[0] = value & 0xff;
array[1] = (value >> 8) & 0xff;
4
Jonathan
union TwoBytes
{
    UINT16 u16;
    UINT8 u8[2];
};

TwoBytes Converter;
Converter.u16 = 65535;
UINT8 *array = Converter.u8;
1
Niki Yoshiuchi

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

((UINT16*)array)[0] = value;
0
RightFullRudder

このスレッドを使用して、さまざまなサイズの配列にまたがるソリューションを開発しました。

UINT32 value = 0xAAFF1188;
int size = 4;
UINT8 array[size];

int i;
for (i = 0; i < size; i++)
{
    array[i] = (value >> (8 * i)) & 0xff;
}
0
omikes