I've spent too many hours on this, and at this point I think I need some help from the experts.
I have a const uint8_t* buffer
, an integer data type (say, uint16_t
), and I know that the buffer
contains packed samples m
bits each where m
is not divisible by 8 (say, m=12 bits). Knowing that buffer
holds N
samples, I need to return an std::vector<uint16_t>
containing the values of these N
samples expanded to uint16_t
.
So, each three bytes (24 bits) of the buffer
contain two 12-bits samples I need to process. I want to implement a generalized function
template <typename OutputType, int BitsPerSample>
std::vector<OutputType> unpack(const uint8_t* data, const size_t numSamplesToUnpack);
Assume the data is big endian and OutputType
is some integer type that can hold the sample value without truncating it.
I understand bit manipulation. I understand how this can be implemented, in principle. But I don't understand how to implement it elegantly and concisely. Got any ideas?
Also, is there a special name or term for this problem?