C++ 将UINT16值转换为UINT8数组[2]

C++ 将UINT16值转换为UINT8数组[2],c++,endianness,C++,Endianness,这个问题基本上是我另一个问题的后半部分 如何将UINT16值转换为无循环的UINT8*数组并避免endian问题 基本上我想做这样的事情: UINT16 value = 0xAAFF; UINT8 array[2] = value; 这样做的最终结果是将值存储到UINT8数组中,同时避免endian转换 UINT8 * mArray; memcpy(&mArray[someOffset],&array,2); 当我用UINT16值简单地执行memcpy时,它会转换成小的end

这个问题基本上是我另一个问题的后半部分

如何将UINT16值转换为无循环的UINT8*数组并避免endian问题

基本上我想做这样的事情:

UINT16 value = 0xAAFF;
UINT8 array[2] = value;
这样做的最终结果是将值存储到UINT8数组中,同时避免endian转换

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

当我用UINT16值简单地执行memcpy时,它会转换成小的endian,这会破坏输出。我试图避免使用endian转换函数,但我想我可能只是运气不好

对UINT16*的临时强制转换应该可以:

((UINT16*)array)[0] = 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 }
演员阵容是可选的。

怎么样

UINT16 value = 0xAAFF;
UINT8 array[2];
array[0]=value & 0xff;
array[1]=(value >> 8);
这应该提供与endianness无关的相同结果

或者,如果要使用数组初始值设定项:

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

(但是,只有当
为常数时,才可能执行此操作。)

假设您希望数组中的高阶字节高于低阶字节:

array[0] = value & 0xff;
array[1] = (value >> 8) & 0xff;

我使用此线程开发了一个解决方案,该解决方案跨越多种大小的阵列:

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

int i;
for (i = 0; i < size; i++)
{
    array[i] = (value >> (8 * i)) & 0xff;
}
UINT32值=0xAAFF1188;
int size=4;
UINT8阵列[大小];
int i;
对于(i=0;i>(8*i))&0xff;
}

这不起作用,因为它仍然对endianness很敏感(基本上,它与问题中的
memcpy
的作用相同)。掩码
0xff
是不必要的:从16位整数到8位整数的转换将删除较高的字节(无符号转换定义良好!),这是真的,但为了清晰起见,我通常会掩盖一切。有时,我甚至会做一点0的移位,这样线条都会匹配起来,垂直方向看起来很好。任何优秀的编译器都会优化不必要的语句,而值得注意的是问题。问题标签是C++,C++语言。
UINT32 value = 0xAAFF1188;
int size = 4;
UINT8 array[size];

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