Преобразование значения UINT16 в массив UINT8 [2

StackOverflow https://stackoverflow.com/questions/1289251

  •  18-09-2019
  •  | 
  •  

Вопрос

Этот вопрос в основном вторая половина моей другой Вопрос

Как я могу преобразовать значение UINT16 в массив UINT8 * без цикла и избегая эндсианских проблем.

В основном я хочу сделать что -то вроде этого:

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

Конечным результатом этого является хранение стоимости в массиве UINT8, избегая при этом Endian Conversion.

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

Когда я просто делаю memcpy со значением Uint16, он преобразуется в Little-Endian, который разрушает вывод. Я пытаюсь избежать использования функций конверсии эндского, но думаю, что мне может быть не повезло.

Это было полезно?

Решение

Как насчет

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