Запись значений в виде произвольного количества битов в байтовый буфер в C ++ - PullRequest
1 голос
/ 17 мая 2011

Эй, мне нужно упаковать битовые значения в байтовый буфер в 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;
}

Как мне решить эту проблему?Спасибо.

РЕДАКТИРОВАТЬ: Мне также все еще нужно иметь возможность писать нормальные байты до и после записи битов.

Ответы [ 2 ]

3 голосов
/ 17 мая 2011

Просто удалите все ключевые слова public, и я бы сказал, что у вас есть реализация C++.

2 голосов
/ 17 мая 2011

Пока вы используете байтовый буфер только как таковой, вы можете переводить Java-код один в один. Это становится опасным, только если вы интерпретируете указатель байта как другой тип и пытаетесь сохранить полное целое число в байтовом буфере.

В этом случае вам даже не нужна функция endianness, так как вы сохраняете байт в байтовом буфере, и нет ничего, что нужно преобразовать или отрегулировать, или что-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...