将值作为任意数量的位写入C ++中的字节缓冲区

时间:2011-05-16 20:13:57

标签: c++ networking bit-manipulation

嘿,我需要在C ++中将位值打包到字节缓冲区中。 My Buffer类有一个char数组和一个位置,类似于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 个答案:

答案 0 :(得分:3)

只需删除所有public个关键字,我就说你已经在那里实施了C++

答案 1 :(得分:2)

只要您这样使用字节缓冲区,就可以一对一地翻译Java代码。如果将字节指针解释为另一种类型并尝试在字节缓冲区中存储完整的int,则只会变得危险。

在这种情况下你甚至不需要endianness函数,因为你在字节缓冲区中存储了一个字节,并且没有任何东西可以转换或调整大小等等。