Converting a UINT16 value into a UINT8 array[2]
-
18-09-2019 - |
Question
This question is basically the second half to my other Question
How can I convert a UINT16 value, into a UINT8 * array without a loop and avoiding endian problems.
Basically I want to do something like this:
UINT16 value = 0xAAFF;
UINT8 array[2] = value;
The end result of this is to store value into a UINT8 array while avoiding endian conversion.
UINT8 * mArray;
memcpy(&mArray[someOffset],&array,2);
When I simply do memcpy with the UINT16 value, it converts to little-endian which ruins the output. I am trying to avoid using endian conversion functions, but think I may just be out of luck.
Solution
How about
UINT16 value = 0xAAFF;
UINT8 array[2];
array[0]=value & 0xff;
array[1]=(value >> 8);
This should deliver the same result independent of endianness.
Or, if you want to use an array initializer:
UINT8 array[2]={ value & 0xff, value >> 8 };
(However, this is only possible if value
is a constant.)
OTHER TIPS
There's no need for conditional compilation. You can bit-shift to get the higher and lower byte of the 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 }
The casts are optional.
Assuming that you want to have the high-order byte above the lower-order byte in the array:
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;
A temporary cast to UINT16* should do it:
((UINT16*)array)[0] = value;
I used this thread to develop a solution that spans arrays of many sizes:
UINT32 value = 0xAAFF1188;
int size = 4;
UINT8 array[size];
int i;
for (i = 0; i < size; i++)
{
array[i] = (value >> (8 * i)) & 0xff;
}