Hello stackoverflow社区,
我需要将字节数组转换为二进制字节数组(是的,二进制字节)。见这个例子:
byte[] source = new byte[] {0x0A, 0x00};
//shall be converted to this:
byte[] target = new byte[] {0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00};
//this would be ok as well:
also[0] = new byte[] {0x00, 0x00, 0x10, 0x10};
also[1] = new byte[] {0x00, 0x00, 0x00, 0x00};
目前我通过使用Integer.toBinaryString获取二进制字符串并使用hexStringToByteArray将二进制字符串转换为字节数组来解决此问题:
for(int o = 0; o < cPage.getCpData().length; o+=cPage.getWidth()) {
String fBinString = "";
for(int u = 0; u < cPage.getWidth(); u++) {
byte[] value = new byte[1];
raBa.read(value);
Byte part = new BigInteger(value).byteValue();
String binString = Integer.toBinaryString(0xFF & part);
fBinString+=("00000000" + binString).substring(binString.length());
}
cPage.addBinaryString(fBinString);
//binaryCodepage.add(fBinString);
testwidth = fBinString.length();
//System.out.println(fBinString);
}
//other class:
public byte[][] getBinaryAsByteArray() {
Object[] binary = getBinaryStrings().toArray();
byte[][] binAsHex = new byte[binary.length][getWidth()*8];
for(int i = 0; i < binary.length; i++) {
binAsHex[i] = ByteUtil.hexStringToByteArray(((String) binary[i]));
}
return binAsHex;
}
这适用于小型源字节数组,但对于大字节数组则需要很长时间。这可能是由转换为二进制String和返回引起的。 任何想法如何通过不将源转换为字符串来改善这一点?
答案 0 :(得分:1)
我不知道这种奇怪转换的动机是什么,但你可以做类似于Integer.toBinaryString
的实现:
private static byte[] toFourBytes(byte i) {
byte[] buf = new byte[4];
int bytePos = 4;
do {
buf[--bytePos] = i & 0x3;
i >>>= 2;
} while (i != 0);
return buf;
}
这应该将每个byte
转换(我没有测试过)到4 byte
数组,其中每个byte
包含原始byte
的2位。
编辑:
我可能错过了确切的要求。如果从输入字节中提取的两位应位于输出字节的第0位和第4位,则代码将更改为:
private static byte[] toFourBytes(byte i) {
byte[] buf = new byte[4];
int bytePos = 4;
do {
byte temp = i & 0x1;
i >>>= 1;
buf[--bytePos] = ((i & 0x1) << 4) | temp;
i >>>= 1;
} while (i != 0);
return buf;
}