这个问题基本上是我对方的下半部 问题

如何将UINT16值转换为无循环的UINT8 *阵列并避免Endian问题。

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

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

最终结果是将值存储到UINT8阵列中,同时避免使用Endian转换。

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

当我简单地使用UINT16值进行memcpy时,它会转换为破坏输出的小末端。我正在努力避免使用Endian转换功能,但认为我可能只是不幸。

有帮助吗?

解决方案

怎么样

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

这应该带来相同的结果,独立于endianness。

或者,如果要使用数组初始化程序:

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