Convert byte-array to a bit byte-array

var2081302

Hello stackoverflow community,

I need to convert a byte array to a binary byte-array (yes, binary bytes). See this example:

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

At the moment I'm solving this by using Integer.toBinaryString to get the binary string and hexStringToByteArray to convert the binary string to a byte array:

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

This works fine for small source byte-arrays but takes ages for large byte-arrays. Thats probably caused by the conversion to binary String and back. Any ideas how to improve this by not converting the source to a String?

Eran

I don't know what's the motivation to this strange conversion, but you could do something similar to the implementation of 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;
 }

This should convert (I haven't tested it) each byte to a 4 byte array, in which each byte contains 2 bits of the original byte.

EDIT:

I may have missed the exact requirement. If the two bits extracted from the input byte should be in positions 0 and 4 of the output byte, the code would change to :

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

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related