将字节数组转换为位字节数组

时间:2014-08-24 11:24:37

标签: java arrays binary byte

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和返回引起的。 任何想法如何通过不将源转换为字符串来改善这一点?

1 个答案:

答案 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;
 }