Convert binary string to byte array
Asked Answered
V

3

14

I have a string of ones and zeros that I want to convert to an array of bytes.

For example String b = "0110100001101001" How can I convert this to a byte[] of length 2?

Vilmavim answered 18/7, 2013 at 15:10 Comment(3)
@kocko he has 16 bits...Milicent
Based off of string b, you want a byte[] length 2 with 104 in position 0, and 105 in position 1?Sudiesudnor
possible duplicate of convert a string to byte arrayMaida
M
26

Parse it to an integer in base 2, then convert to a byte array. In fact, since you've got 16 bits it's time to break out the rarely used short.

short a = Short.parseShort(b, 2);
ByteBuffer bytes = ByteBuffer.allocate(2).putShort(a);

byte[] array = bytes.array();
Mylesmylitta answered 18/7, 2013 at 15:12 Comment(6)
What if the String contains too many bits that it can't be hold even in a long variable?Paten
If the string is too big, then you'll get a NumberFormatException. I'm making assumptions that it's less than 32 characters for this small example.Mylesmylitta
Then this is not a bullet-proof solution. Is there any with simple code or it involves manual working on the String contents?Paten
I'm not sure this could get much simple? If b is in an invalid format a NumberFormatException will be thrown and it's up to the callee to handle the error. Open to suggestions on how to improve this, but I think this is enough of an answer to illustrate the point.Mylesmylitta
@LuiggiMendoza using BigInteger as the other answer suggested will take care of that issue.Phylloquinone
Thank you, this worked well. I should have been more clear though, I split the string every 8 characters so I only needed to loop through the split string and add it to the byte[] array.Vilmavim
O
25

Another simple approach is:

String b = "0110100001101001";
byte[] bval = new BigInteger(b, 2).toByteArray();
Overnight answered 18/7, 2013 at 15:27 Comment(4)
it cannot parse "1110100001101001"Thrower
See #24159129 You might have some sign issues.Mutineer
When I'm displaying byte[] fspec = new BigInteger("10000000", 2).toByteArray();, it shows [B@3b22cdd0 instead of expected value - why?Macule
@Macule Because you're displaying it wrong. See What's the simplest way to print a Java array?Railing
G
2

Assuming that your binary String can be divided by 8 without getting a rest you can use following method:

/**
 * Get an byte array by binary string
 * @param binaryString the string representing a byte
 * @return an byte array
 */
public static byte[] getByteByString(String binaryString){
    Iterable iterable = Splitter.fixedLength(8).split(binaryString);
    byte[] ret = new byte[Iterables.size(iterable) ];
    Iterator iterator = iterable.iterator();
    int i = 0;
    while (iterator.hasNext()) {
        Integer byteAsInt = Integer.parseInt(iterator.next().toString(), 2);
        ret[i] = byteAsInt.byteValue();
        i++;
    }
    return ret;
}

Don't forget to add the guava lib to your dependecies.

In Android you should add to app gradle:

compile group: 'com.google.guava', name: 'guava', version: '19.0'

And add this into project gradle:

allprojects {
    repositories {
        mavenCentral()
    }
}

Update 1

This post contains a solution without using Guava Lib.

Glister answered 28/11, 2016 at 10:6 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.