将6/10/12位流转换为缩放的unsigned char / short

时间:2011-06-17 02:53:19

标签: c++ unsigned bit bcd


在PC的世界中,一个字节通常表示8位的存储器边界对齐,计算机将其视为单个单元。在迷你和大型计算机中,也可以使用较长的序列,如16位和32位(分别称为全字和双字)。

但在遥感世界中,传感器/探测器用于测量来自大气和地球的辐射强度的变化,使用它们自己的辐射分辨率,如6位,10位和12位。因此,由地面站捕获的遥感原始数据图像总是以6比特,10比特或12比特BCD流的形式打包。这些数据按扫描线存储在扫描线上
我的工作是逐个读取这种扫描线形成一个opend二进制文件,并存储到unsigned char源缓冲区一段时间。对于6位流,我必须扩展到8位(一个字节),对于10位或12位流,我将使它们成为无符号的短整数。最后,我应该得到一个unsigned char(对于6位)或无符号短目标缓冲区
你能告诉我怎么做吗? C / C ++代码演示将受到高度赞赏!谢谢。

10101010 01110101 00011001
|         |
-----------
 10-bit BCD

10101010 01110101 00011001
      |         |
      -----------
       10-bit BCD

10101010 01110101 01100110
       |          |
       ------------
         10-bit BCD

1 个答案:

答案 0 :(得分:2)

通常的方法是通过输入和输出之间的位数差来左移,然后从输入中加入高位,以填充低位。

unsigned char eightbit = (sixbit << 2) | (sixbit >> 4);
unsigned short sixteenbit = (tenbit << 6) | (tenbit >> 4);
unsigned short sixteenbit = (twelvebit << 4) | (twelvebit >> 8);

我还没有经常看到低位的替代方法 - 用噪声填充它们。这掩盖了原始样本中的一些量化误差。

unsigned char eightbit = (sixbit << 2) | (sixteenbitnoise >> 14);
unsigned short sixteenbit = (tenbit << 6) | (sixteenbitnoise >> 10);
unsigned short sixteenbit = (twelvebit << 4) | (sixteenbitnoise >> 12);