将两个字节转换为12位短值?

use*_*356 0 c++ casting

我有一个缓冲区,由unsigned char中的数据组成,两个字节组成一个12位值.

我发现我的系统是小端.缓冲区中的第一个字节为我提供了从0到255的控制台编号.第二个字节总是给出1到8之间的低数字(测量数据,因此也可以使用高达4位的值).

我试图将它们组合在一起,以便得到一个正确的12位数的ushort.

可悲的是,此刻我对于endianess和我必须改变的方向感到十分困惑.

我试过这样的:

ushort value =0;
value= (ushort) firstByte << 8 | (ushort) secondByte << 4;
Run Code Online (Sandbox Code Playgroud)

可悲的是,价值通常大于12位.

哪里出错了?

Pau*_*l R 6

它取决于两个字节中的位如何精确打包,但最可能包装的解决方案是:

value = firstByte | (secondByte << 8);
Run Code Online (Sandbox Code Playgroud)

这假设第二个字节包含4个最高有效位(位8..11),而第一个字节包含8个最低有效位(位0..7).


注意:上面的解决方案假定firstByte并且secondByte是明智的无符号类型(例如uint8_t).如果它们不是(例如,如果您使用过char或其他可能签名的类型),那么您将需要添加一些屏蔽:

value = (firstByte & 0xff) | ((secondByte & 0xf) << 8);
Run Code Online (Sandbox Code Playgroud)