2013-07-18 120 views
6

我有一串1和零,我想要轉換爲一個字節數組。將二進制字符串轉換爲字節數組

例如String b = "0110100001101001"怎樣才能將它轉換爲長度爲2的byte[]

+0

爲什麼長度2? –

+3

@kocko他有16位... –

+0

根據字符串b,你想要一個byte []長度爲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

如果字符串中包含的位太多,即使在一個「長」變量中也不能保持? –

+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

當我顯示byte [] 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() 
    } 
} 

更新1

This post contains的解決方案,而無需使用番石榴庫。

相關問題