Эй, мне нужно упаковать битовые значения в байтовый буфер в C++. Мой класс Buffer имеет массив символов и позицию, аналогичную ByteBuffer в Java. Мне нужен хороший способ упаковать биты в этот буфер, например:
void put_bits(int amount, uint32_t value);
Он должен поддерживать до 32 бит. Я видел решение, реализованное на Java (которое требует методов начала/окончания доступа, прежде чем биты могут быть упакованы), но я не уверен, как это сделать на С++, потому что порядок следования байтов и другие низкоуровневые факторы не скрыты, как они в Яве.
У меня есть встроенная функция, объявленная как endianness()
, которая возвращает 0 (определяется как BIG_ENDIAN
) или 1 (определяется как LITTLE_ENDIAN
), которую можно использовать, но я просто не уверен, как правильно упаковать биты в байтовый буфер.
Это Java-версия того, что мне нужно реализовать:
public void writeBits(int numBits, int value) {
int bytePos = bitPosition >> 3;
int bitOffset = 8 - (bitPosition & 7);
bitPosition += numBits;
for(; numBits > bitOffset; bitOffset = 8) {
buffer[bytePos] &= ~ bitMaskOut[bitOffset];
buffer[bytePos++] |= (value >> (numBits-bitOffset)) & bitMaskOut[bitOffset];
numBits -= bitOffset;
}
if(numBits == bitOffset) {
buffer[bytePos] &= ~ bitMaskOut[bitOffset];
buffer[bytePos] |= value & bitMaskOut[bitOffset];
}
else {
buffer[bytePos] &= ~ (bitMaskOut[numBits]<<(bitOffset - numBits));
buffer[bytePos] |= (value&bitMaskOut[numBits]) << (bitOffset - numBits);
}
}
Для этого также требуются эти два метода:
public void initBitAccess() {
bitPosition = currentOffset * 8;
}
public void finishBitAccess() {
currentOffset = (bitPosition + 7) / 8;
}
Как мне решить эту проблему? Спасибо.
РЕДАКТИРОВАТЬ: мне также нужно иметь возможность записывать обычные байты до и после записи битов.