简体   繁体   English

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

[英]Converting a UINT16 value into a UINT8 array[2]

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. 如何将UINT16值转换为没有循环的UINT8 *数组并避免endian问题。

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数组中,同时避免了字节序转换。

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. 当我只使用UINT16值执行memcpy时,它会转换为little-endian,这会破坏输出。 I am trying to avoid using endian conversion functions, but think I may just be out of luck. 我试图避免使用endian转换函数,但我想我可能只是运气不好。

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. 这应该提供与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.) (但是,只有当value是常量时才可以这样做。)

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;

临时演员到UINT16 *应该这样做:

((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;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM