我写了一些东西来简化这种工作。像大多数任务一样,编写工具比尝试手动完成所有事情要容易得多。
它由两个类组成,这是一个如何使用它的示例:
// Resulting byte array is 9 bytes long.
byte[] ba = new ByteArrayBuilder()
.writeInt(0xaaaa5555) // 4 bytes
.writeByte(0x55) // 1 byte
.writeShort(0x5A5A) // 2 bytes
.write( (new BitBuilder()) // 2 bytes---0xBA12
.write(3, 5) // 101 (3 bits value of 5)
.write(2, 3) // 11 (2 bits value of 3)
.write(3, 2) // 010 (...)
.write(2, 0) // 00
.write(2, 1) // 01
.write(4, 2) // 0002
).getBytes();
我编写了 ByteArrayBuilder 来简单地累积位。我使用了一种方法链接模式(只是从所有方法中返回“this”),以便更容易地一起编写一堆语句。
ByteArrayBuilder 中的所有方法都是微不足道的,就像 1 或 2 行代码(我只是将所有内容都写入数据输出流)
这是构建一个数据包,但撕开一个应该不会更难。
BitBuilder 中唯一有趣的方法是这个:
public BitBuilder write(int bitCount, int value) {
int bitMask=0xffffffff;
bitMask <<= bitCount; // If bitcount is 4, bitmask is now ffffff00
bitMask = ~bitMask; // and now it's 000000ff, a great mask
bitRegister <<= bitCount; // make room
bitRegister |= (value & bitMask); // or in the value (masked for safety)
bitsWritten += bitCount;
return this;
}
同样,可以很容易地反转逻辑以读取数据包而不是构建数据包。
编辑:我在这个答案中提出了一种不同的方法,我将把它作为一个单独的答案发布,因为它完全不同。