2013-07-18 44 views
6

Tôi có một chuỗi các số và số không mà tôi muốn chuyển đổi thành một mảng byte.Chuyển đổi chuỗi nhị phân thành mảng byte

Ví dụ: String b = "0110100001101001" Làm cách nào để chuyển đổi số này thành số byte[] chiều dài 2?

+0

Tại sao lại có chiều dài 2? –

+3

@kocko anh ta có 16 bit ... –

+0

Dựa trên chuỗi b, bạn muốn có độ dài byte [] 2 với '104' ở vị trí 0 và' 105' ở vị trí 1? –

Trả lời

21

Phân tích cú pháp thành số nguyên trong cơ sở 2, sau đó chuyển đổi thành mảng byte. Trong thực tế, kể từ khi bạn đã có 16 bit đó là thời gian để thoát ra khỏi hiếm khi được sử dụng short.

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

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

Điều gì sẽ xảy ra nếu Chuỗi chứa quá nhiều bit mà nó có thể ' t được giữ ngay cả trong biến 'long'? –

+0

Điều này rất tuyệt! Tôi không biết, cảm ơn! :) –

+0

Nếu chuỗi quá lớn, bạn sẽ nhận được 'SốFormatException'. Tôi đang đưa ra giả định rằng nó ít hơn 32 ký tự cho ví dụ nhỏ này. –

12

Một phương pháp đơn giản là:

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

không thể phân tích cú pháp "1110100001101001" –

+0

Xem http://stackoverflow.com/questions/24158629/biginteger-tobytearray-returns-purposeful-leading-zeros Bạn có thể gặp một số vấn đề về dấu hiệu. – will

+0

Khi tôi hiển thị byte [] fspec = new BigInteger ("10000000", 2) .toByteArray() ;, nó hiển thị [B @ 3b22cdd0 thay vì giá trị kỳ vọng - tại sao? – Line

0

Giả sử rằng chuỗi nhị phân của bạn có thể được chia cho 8 mà không nhận được một phần còn lại bạn có thể sử dụng phương pháp sau đây:

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

Đừng quên để thêm các guava lib để dependecies của bạn.

Trong Android bạn nên thêm vào ứng dụng gradle:

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

Và thêm này vào gradle dự án:

allprojects { 
    repositories { 
     mavenCentral() 
    } 
} 

Cập nhật 1

This post contains một giải pháp mà không sử dụng ổi Lib.