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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.