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

dp.*_*dp. 14 c++ endianness

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

如何将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在常量的情况下才可行.)


Chr*_*oph 7

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

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)

演员阵容是可选的.

  • 问号标签是c ++,使用c ++强制转换. (3认同)

Jon*_*han 5

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

array[0] = value & 0xff;
array[1] = (value >> 8) & 0xff;
Run Code Online (Sandbox Code Playgroud)

  • 确实如此,但为了清楚起见,我通常会掩盖所有内容。有时,我什至会进行 0 位移位,以便所有线条都匹配并在垂直方向上看起来很好。任何好的编译器都会优化掉不必要的语句,这非常值得澄清。 (4认同)
  • 掩码“0xff”是不必要的:从 16 位整数到 8 位整数的转换将丢弃较高的字节(无符号转换是明确定义的!) (3认同)