C++ 解包位大小不可被8整除的值流

C++ 解包位大小不可被8整除的值流,c++,bit-manipulation,C++,Bit Manipulation,我在这方面花了太多时间,现在我想我需要专家们的帮助 我有一个constuint8*buffer,一个整数数据类型(比如,uint16*t),我知道buffer包含压缩样本m位,其中m不能被8整除(比如,m=12位)。知道buffer保存N样本,我需要返回一个std::vector,其中包含扩展到uint16\t的这些N样本的值 因此,缓冲区的每三个字节(24位)包含两个我需要处理的12位样本。我想实现一个广义函数 template <typename OutputType, int Bit

我在这方面花了太多时间,现在我想我需要专家们的帮助

我有一个
constuint8*buffer
,一个整数数据类型(比如,
uint16*t
),我知道
buffer
包含压缩样本
m
位,其中
m
不能被8整除(比如,m=12位)。知道
buffer
保存
N
样本,我需要返回一个
std::vector
,其中包含扩展到
uint16\t
的这些
N
样本的值

因此,
缓冲区的每三个字节(24位)包含两个我需要处理的12位样本。我想实现一个广义函数

template <typename OutputType, int BitsPerSample>
std::vector<OutputType> unpack(const uint8_t* data, const size_t numSamplesToUnpack);
模板
标准::矢量解包(常量uint8_t*数据,常量大小_t numSamplesToUnpack);
假设数据是big-endian,
OutputType
是某种整数类型,可以保存样本值而不截断样本值

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


另外,这个问题有没有一个特殊的名称或术语?

也许您可以尝试一次读取单个位,并保留一个运行计数器,记录您处理了多少位。当消耗8位时,可以增加缓冲区指针


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

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

您是否检查了
boost::transform_width
?这可能与@Slava有关:在您指出之前,这可能与它无关(我在这个项目中没有
boost
,也不想把它拉进去)。那是。。。很多代码。有点像我会天真地写的东西,只是它更一般化和抽象化。要求“优雅而简洁地实现它。有什么想法吗?”使得这篇文章“基于观点”。还有,我脑海中浮现的第一件事是,“你试过什么?”?如果你花了X个小时,肯定会有更多或更少的代码碎片。也许给他们看看,然后在这里修好?另外,你的目标是解决它,还是自己进行练习并实现它?另外,您希望它有多复杂?您希望支持哪些输出类型,以及如何构造和/或填充它们?还有,
data
BigEndian,LittleEndian?太多的未知数,所有这些都会影响优雅/冗长。@quetzalcatl:我将进一步阐述这个问题。请注意,虽然你没有错,这是基于意见的,我不是要求完全实现,只是为了我可以尝试的方法(但最终我只需要它来工作,这不是一个练习,它是一个现实世界的问题)。Hmm,我没有考虑字面上阅读单位而不是块。我的意思是,为了速度,您可以对其进行优化,使其能够以块的形式进行实际读取,但接下来您需要确保处理剩余的位。(假设是一个9位的示例,您可以读入一个字节,后跟1位)。如果样本大小小于一个字节,这可能不可能,因此。。。