2013-07-18 10 views
6

Ich habe eine Folge von Einsen und Nullen, die ich in ein Array von Bytes konvertieren möchte.Konvertiere binäre Zeichenfolge in Byte-Array

Zum Beispiel String b = "0110100001101001" Wie kann ich dies in eine byte[] der Länge 2 konvertieren?

+0

Warum von Länge 2? –

+3

@kocko Er hat 16 Bit ... –

+0

Basiert auf String b, wollen Sie ein Byte [] Länge 2 mit '104' in Position 0 und' 105' in Position 1? –

Antwort

21

Analysieren Sie es zu einer Ganzzahl in der Basis 2 und konvertieren Sie es dann in ein Byte-Array. In der Tat, da Sie 16 Bits haben, ist es Zeit, die selten verwendete short auszubrechen.

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

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

Was passiert, wenn der String zu viele Bits enthält, die er enthalten kann? t selbst in einer 'langen' Variable gehalten werden? –

+0

Das ist sehr cool! Ich wusste es nicht, danke! :) –

+0

Wenn die Zeichenfolge zu groß ist, erhalten Sie eine 'NumberFormatException'. Ich nehme an, dass es für dieses kleine Beispiel weniger als 32 Zeichen enthält. –

12

Eine weitere einfache Methode ist:

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

kann nicht analysiert werden "1110100001101001" –

+0

Siehe http://stackoverflow.com/questions/24158629/bigintegert-tobytearray-returns-purposeful-leading-zeros Sie könnten einige Zeichen Probleme haben. – will

+0

Wenn ich byte [] fspec = new BigInteger ("10000000", 2) .toByteArray(); anzeigen, wird [B @ 3b22cdd0 anstelle des erwarteten Werts angezeigt - warum? – Line

0

Unter der Annahme, dass Ihre binären String kann durch 8 ohne sich eine Pause unterteilt werden Sie folgende Methode verwenden:

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

Nicht vergessen um die guava lib zu Ihren Abhängigkeiten hinzuzufügen.

In Android sollten Sie zu App gradle hinzufügen:

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

Und das gradle in Projekt hinzufügen:

allprojects { 
    repositories { 
     mavenCentral() 
    } 
} 

Update 1

This post contains eine Lösung ohne Verwendung von Guava Lib.

Verwandte Themen