这个问题基本上是我的另一个问题的下半部分
如何将UINT16值转换为没有循环的UINT8*数组并避免endian问题.
基本上我想做这样的事情:
UINT16 value = 0xAAFF;
UINT8 array[2] = value;
Run Code Online (Sandbox Code Playgroud)
最终结果是将值存储到UINT8数组中,同时避免了字节序转换.
UINT8 * mArray;
memcpy(&mArray[someOffset],&array,2);
Run Code Online (Sandbox Code Playgroud)
当我只使用UINT16值执行memcpy时,它会转换为little-endian,这会破坏输出.我试图避免使用endian转换函数,但我想我可能只是运气不好.
Mar*_*n B 30
怎么样
UINT16 value = 0xAAFF;
UINT8 array[2];
array[0]=value & 0xff;
array[1]=(value >> 8);
Run Code Online (Sandbox Code Playgroud)
这应该提供与endianness无关的相同结果.
或者,如果要使用数组初始值设定项:
UINT8 array[2]={ value & 0xff, value >> 8 };
Run Code Online (Sandbox Code Playgroud)
(但是,只有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 }
Run Code Online (Sandbox Code Playgroud)
演员阵容是可选的.
假设您希望数组中的高位字节高于低位字节:
array[0] = value & 0xff;
array[1] = (value >> 8) & 0xff;
Run Code Online (Sandbox Code Playgroud)