2


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

但在遥感世界中,传感器/探测器用于通过使用它们自己的辐射分辨率(例如 6 位、10 位和 12 位)来测量来自大气和地球的辐射强度的变化。因此,地面站采集的遥感原始数据图像总是以 6 位、10 位或 12 位 BCD 流的形式打包。这些数据逐个扫描线存储。

我的工作是从一个打开的二进制文件中一个一个地读取这种扫描线,并存储到一个无符号字符源缓冲区中一段时间​​。对于 6 位流,我必须缩放到 8 位(一个字节),对于 10 位或 12 位流,我会将它们缩放为无符号短整数。最后,我应该得到一个无符号字符(6 位)或无符号短目标缓冲区。

你能告诉我怎么做吗?C/C++ 代码演示将不胜感激!谢谢你。

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

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

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

1 回答 1

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);
于 2011-06-17T04:11:00.737 回答