2013-07-18 4 views
6

У меня есть строка из них и нули, которые я хочу преобразовать в массив байтов.Преобразование двоичной строки в байтовый массив

Например, String b = "0110100001101001" Как это можно преобразовать в byte[] длины 2?

+0

Почему длина 2? –

+3

@kocko у него есть 16 бит ... –

+0

Основываясь на строке b, вы хотите, чтобы байт [] был длиной 2 с '104' в позиции 0 и' 105' в позиции 1? –

ответ

21

Разделите его на целое число в базе 2, а затем преобразуйте в массив байтов. На самом деле, поскольку у вас есть 16 бит, пришло время вырваться из редко используемого short.

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

byte[] array = bytes.array(); 
+3

Что делать, если строка содержит слишком много бит, t быть даже в переменной 'long'? –

+0

Это очень круто! Я этого не знал, спасибо! :) –

+0

Если строка слишком большая, то вы получите 'NumberFormatException'. Я делаю предположения, что это меньше 32 символов для этого небольшого примера. –

12

Другой простой подход:

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

он не может разобрать «1110100001101001» –

+0

См. Http://stackoverflow.com/questions/24158629/biginteger-tobytearray-returns-purposeful-leading-zeros Возможно, у вас есть некоторые проблемы с знаками. – will

+0

Когда я показываю байт [] fspec = new BigInteger («10000000», 2) .toByteArray() ;, он показывает [B @ 3b22cdd0 вместо ожидаемого значения - почему? – Line

0

Предполагая, что ваш двоичная строка может быть разделена на 8, не получая остальное вы можете использовать следующий метод:

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

Не стоит забывать чтобы добавить guava lib к вашим зависимостям.

В Android вы должны добавить в приложение Gradle:

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

И добавить это в проекте Gradle:

allprojects { 
    repositories { 
     mavenCentral() 
    } 
} 

Update 1

This post contains раствор без использования Guava Lib.

Смежные вопросы