这个问题基本上是我的另一半Question
的下半部分如何将UINT16值转换为没有循环的UINT8 *数组并避免endian问题。
基本上我想做这样的事情:
UINT16 value = 0xAAFF;
UINT8 array[2] = value;
最终结果是将值存储到UINT8数组中,同时避免了字节序转换。
UINT8 * mArray;
memcpy(&mArray[someOffset],&array,2);
当我只使用UINT16值执行memcpy时,它会转换为little-endian,这会破坏输出。我试图避免使用endian转换函数,但我想我可能只是运气不好。
答案 0 :(得分:28)
怎么样
UINT16 value = 0xAAFF;
UINT8 array[2];
array[0]=value & 0xff;
array[1]=(value >> 8);
这应该提供与endianness无关的相同结果。
或者,如果你想使用数组初始值设定项:
UINT8 array[2]={ value & 0xff, value >> 8 };
(但是,只有在value
为常数时才可以这样做。)
答案 1 :(得分:7)
不需要条件编译。您可以按位移位以获取值的较高和较低字节:
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 }
演员表是可选的。
答案 2 :(得分:4)
假设您希望高位字节高于数组中的低位字节:
array[0] = value & 0xff;
array[1] = (value >> 8) & 0xff;
答案 3 :(得分:1)
union TwoBytes
{
UINT16 u16;
UINT8 u8[2];
};
TwoBytes Converter;
Converter.u16 = 65535;
UINT8 *array = Converter.u8;
答案 4 :(得分:0)
UINT16 *的临时演员应该这样做:
((UINT16*)array)[0] = value;
答案 5 :(得分:0)
我使用这个线程来开发一个跨越多种大小的数组的解决方案:
UINT32 value = 0xAAFF1188;
int size = 4;
UINT8 array[size];
int i;
for (i = 0; i < size; i++)
{
array[i] = (value >> (8 * i)) & 0xff;
}