Эй, мне нужно упаковать битовые значения в байтовый буфер в C ++.Мой класс Buffer имеет массив символов и позицию, похожую на Java ByteBuffer.Мне нужен хороший способ упаковать биты в этот буфер, например так:
void put_bits(int amount, uint32_t value);
Он должен поддерживать до 32 бит.Я видел решение, реализованное в Java (для этого требуются методы доступа начала / конца, прежде чем биты могут быть упакованы), но я не уверен, как это сделать в C ++, потому что порядковый номер и другие низкоуровневые факторы не скрыты, как онив 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;
}
Как мне решить эту проблему?Спасибо.
РЕДАКТИРОВАТЬ: Мне также все еще нужно иметь возможность писать нормальные байты до и после записи битов.