我正在尝试构建一个实用程序类以使按位操作和转换更具可读性。目前我一直在构建一种方法来从字节数组中提取位并从中形成一个新的 byte[]。不用说我对按位运算不是很流利。
我相信它可能可以使用 BitSet 来实现,但是会有太多的转换并且实现将是特定于 Java 的。如果有一个清晰的算法可以在以后轻松移植到其他语言,那就太好了。
到目前为止,我已经做到了:
public static byte[] toBytes(int offset /*full bytes*/, int bitsOffset /*bytes + bits*/, int bitsCount, byte... bytes) {
int bytesCount = bitsCount / 8;
int paddingBits = bitsCount % 8;
int partialBits = 8 - paddingBits;
if (paddingBits > 0) {
bytesCount++;
}
byte[] data = new byte[bytesCount];
return data;
}
我已经评论了上面的内容并将其临时替换为
public static byte[] toBytes(int offset, int bitsOffset, int bitsCount, byte... bytes) {
int firstBitIndex = (offset * 8) + bitsOffset;
return new BigInteger(new BigInteger(1, bytes).toString(2).substring(firstBitIndex, firstBitIndex + bitsCount), 2).toByteArray();
}
但是我仍然希望有一个尽可能少的开销并且不特定于 Java 的正确实现(不使用特定于 Java 的工具,如 BitSet)
这是我期望它做什么的暗示
/**
* [0000 0110 1111 0010] = toBytes(1, 4, 12, [xxxx xxxx xxxx 0110 1111 0010 xxxx xxxx])
* [0000 0110 1111 0010] = toBytes(1, 5, 12, [xxxx xxxx xxxx x011 0111 1001 0xxx xxxx])
* [0000 0110 1111 0010] = toBytes(1, 6, 12, [xxxx xxxx xxxx xx01 1011 1100 10xx xxxx])
*/
摇曳的蔷薇
相关分类