解压缩不能被8

时间:2018-06-05 20:39:56

标签: c++ bit-manipulation

我花了太多时间在这上面,此时我觉得我需要专家帮助。

我有一个const uint8_t* buffer,一个整数数据类型(比如uint16_t),我知道buffer包含每个{{1}的压缩样本m位不能被8整除(比方说,m = 12位)。知道m包含buffer个样本,我需要返回一个N,其中包含展开到std::vector<uint16_t>的这些N个样本的值。

因此,uint16_t的每三个字节(24位)包含我需要处理的两个12位样本。我想实现一个通用函数

buffer

假设数据是大端,template <typename OutputType, int BitsPerSample> std::vector<OutputType> unpack(const uint8_t* data, const size_t numSamplesToUnpack); 是某种整数类型,可以保存样本值而不截断它。

我理解位操作。我理解原则上如何实现这一点。但我不明白如何优雅和简洁地实现它。有什么想法吗?

此外,这个问题还有一个特殊的名称或术语吗?

2 个答案:

答案 0 :(得分:0)

也许你可以尝试一次读取一位,并保持一个运行的计数器,你已经处理了多少位。消耗8位时,可以递增缓冲区指针。

这并不意味着您已经完成了对该样本的解包,因此您还需要保留一个&#34; bits_left&#34;计数器,以防您在解压缩样本之前需要移动缓冲区指针。

答案 1 :(得分:0)

使用32位字作为缓冲区。如果它少于12位,则读取另一个字节。否则,输出一个12位字。