如何解码重复的无符号MSB和LSB 8位字?

Sid*_*rth 3 c c++ embedded

我正在编写一个模块,通过串口从光谱仪接收一些数据,需要对其进行解码.根据手册,光谱数据在重复的无符号MSB和LSB 8位字中被编码为512字节.我将如何在C/C++中解码?

23- 534在重复无符号MSB和LSB 8位字[MSB]*256 + [LSB]中编码为512字节.

这是手册中的一个片段.

好的,我想在这个问题的另一部分添加.根据下面的评论,这是一个big-endian.现在,我对此感到困惑的是,如果它确实是big-endian,那么转换为little-endian会不会像反转所有字节的顺序一样简单?如果是这种情况,那么输出到那将基本上是...... LSB5,MSB5,LSB4,MSB4,LSB3,MSB3,LSB2,MSB2,LSB1,MSB1等等,然后可以转换为16比特话.我在这里错了什么?

此外,如果这确实是big-endian,那么处理转换的方法是否存在任何原生(甚至是特定于平台的,如果必要但更快)的方法?

Eri*_*son 5

我有时候过度优化,所以即使Fiddling Bits提供了一个非常合适的解决方案,它也不需要分配和不需要的分支.所以我会在这里提供一个多余的答案.

uint8_t byteArray[512];
uint16_t wordArray[256], word, byteIdx, wordIdx;

for (byteIdx=0, wordIdx=0; byteIdx < 511; )
{
    word = byteArray[byteIdx++] << 8;
    wordArray[wordIdx++] = word | byteArray[byteIdx++]
}
Run Code Online (Sandbox Code Playgroud)

关键概念是将MSB字节向上移位8位(x << 8相当于x*256)然后或/将其添加到LSB以形成16位字.其余的都是索引管理.