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?

3
  • 3
    @kocko he has 16 bits... Commented Jul 18, 2013 at 15:13
  • Based off of string b, you want a byte[] length 2 with 104 in position 0, and 105 in position 1? Commented Jul 18, 2013 at 15:18
  • possible duplicate of convert a string to byte array Commented Jul 25, 2013 at 7:37

3 Answers 3

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();
Sign up to request clarification or add additional context in comments.

6 Comments

What if the String contains too many bits that it can't be hold even in a long variable?
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.
Then this is not a bullet-proof solution. Is there any with simple code or it involves manual working on the String contents?
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.
@LuiggiMendoza using BigInteger as the other answer suggested will take care of that issue.
|
25

Another simple approach is:

String b = "0110100001101001";
byte[] bval = new BigInteger(b, 2).toByteArray();

4 Comments

it cannot parse "1110100001101001"
See stackoverflow.com/questions/24158629/… You might have some sign issues.
When I'm displaying byte[] fspec = new BigInteger("10000000", 2).toByteArray();, it shows [B@3b22cdd0 instead of expected value - why?
@Line Because you're displaying it wrong. See What's the simplest way to print a Java array?
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.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.