我花了太多时间在这上面,此时我觉得我需要专家帮助。
我有一个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);
是某种整数类型,可以保存样本值而不截断它。
我理解位操作。我理解原则上如何实现这一点。但我不明白如何优雅和简洁地实现它。有什么想法吗?
此外,这个问题还有一个特殊的名称或术语吗?
答案 0 :(得分:0)
也许你可以尝试一次读取一位,并保持一个运行的计数器,你已经处理了多少位。消耗8位时,可以递增缓冲区指针。
这并不意味着您已经完成了对该样本的解包,因此您还需要保留一个&#34; bits_left&#34;计数器,以防您在解压缩样本之前需要移动缓冲区指针。
答案 1 :(得分:0)
使用32位字作为缓冲区。如果它少于12位,则读取另一个字节。否则,输出一个12位字。