18

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

如何将 UINT16 值转换为没有循环的 UINT8 * 数组并避免字节序问题。

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

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

这样做的最终结果是将值存储到 UINT8 数组中,同时避免字节序转换。

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

当我简单地使用 UINT16 值进行 memcpy 时,它会转换为破坏输出的小端序。我试图避免使用字节序转换函数,但我想我可能只是不走运。

4

6 回答 6

45

怎么样

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

这应该提供与字节顺序无关的相同结果。

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

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

(但是,这只有在value是一个常数时才有可能。)

于 2009-08-17T17:38:37.923 回答
8

不需要条件编译。您可以位移以获取值的高字节和低字节:

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 }

演员表是可选的。

于 2009-08-17T17:34:27.883 回答
6

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

array[0] = value & 0xff;
array[1] = (value >> 8) & 0xff;
于 2009-08-17T17:40:25.780 回答
1
union TwoBytes
{
    UINT16 u16;
    UINT8 u8[2];
};

TwoBytes Converter;
Converter.u16 = 65535;
UINT8 *array = Converter.u8;
于 2009-08-17T17:47:42.630 回答
0

临时转换为 UINT16* 应该这样做:

((UINT16*)array)[0] = value;
于 2009-08-17T17:26:18.790 回答
0

我使用这个线程开发了一个跨越多种大小数组的解决方案:

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

int i;
for (i = 0; i < size; i++)
{
    array[i] = (value >> (8 * i)) & 0xff;
}
于 2015-11-24T19:28:17.553 回答