2011-12-28 78 views
22

Tôi có một mảng Chuỗi. Tôi muốn chuyển đổi nó thành mảng byte. Tôi sử dụng chương trình Java. Ví dụ:Cách chuyển chuỗi thành byte trong Java

String str[] = {"aa", "55"}; 

chuyển đổi để:

byte new[] = {(byte)0xaa, (byte)0x55}; 

tôi có thể làm gì?

+1

Xem http://stackoverflow.com/questions/140131/convert-a-string-representation-of-a-hex-dump-to-a-byte -array-using-java – rafraf

+1

'byte n [] = str.getBytes()' sẽ thực hiện tác vụ. Tuy nhiên, bạn sẽ gặp lỗi trên 'new' vì nó là một từ khóa và không thể được sử dụng làm định danh. – backslashN

Trả lời

14

Nhìn vào mẫu Tôi đoán bạn có nghĩa là mảng chuỗi thực sự là mảng biểu diễn byte HEX, phải không?

Nếu có, sau đó cho từng hạng mục chuỗi Tôi sẽ làm như sau:

  1. kiểm tra rằng một chuỗi chỉ gồm 2 ký tự
  2. những ký tự ở trong '0' .. '9' hoặc ' một' .. 'f' khoảng thời gian (lấy trường hợp của họ vào tài khoản cũng)
  3. chuyển đổi mỗi nhân vật đến một số tương ứng, trừ giá trị mã của '0' hoặc 'a'
  4. xây dựng một giá trị byte, nơi char đầu tiên là bit cao hơn và char thứ hai là các bit thấp hơn. Ví dụ.

    int byteVal = (firstCharNumber << 4) | secondCharNumber; 
    
8

Bạn có thể thử một cái gì đó tương tự như sau:

String s = "65"; 

byte value = Byte.valueOf(s); 

Sử dụng Byte.ValueOf() phương pháp cho tất cả các yếu tố trong mảng String để chuyển đổi chúng thành các giá trị Byte.

+7

Nó không hoạt động. java.lang.NumberFormatException: không thể phân tích cú pháp 'aa' thành số nguyên – brian

+0

Điều đó có nghĩa là chuỗi rỗng –

11

chuỗi Convert to byte-Array:

byte[] theByteArray = stringToConvert.getBytes(); 

Chuyển đổi String để Byte:

String str = "aa"; 

byte b = Byte.valueOf(str); 
+2

cho tôi 'SốFormatException' khi nhập giá trị từ' A' sang 'F' –

2
String source = "testString"; 
byte[] byteArray = source.getBytes(encoding); 

Bạn có thể foreach và làm tương tự với tất cả các chuỗi trong mảng.

+0

Ý nghĩa của tôi là thay đổi (Chuỗi)" aa "đến (byte) 0x97, nhưng không phải (byte) 0x97, (byte) 0x97 – brian

53
String str = "Your string"; 

byte[] array = str.getBytes(); 
+3

Luôn chỉ định một bộ ký tự cụ thể như' UTF-8' trừ khi bộ ký tự phụ thuộc nền tảng mặc định là đủ (điều này là không mong muốn trong hầu hết các trường hợp) sử dụng một trong các phiên bản quá tải của phương thức đó, chẳng hạn như 'String # getBytes (Charset charset)' hoặc 'String # getBytes (String charsetName)'. – Tiny

+0

byte [] array = str.getBytes ("UTF-8"); ném UnsupportedEncodingException – daddygames

3

Một chặng đường dài để đi :).Tôi không biết các phương pháp để thoát khỏi for báo cáo dài

ArrayList<Byte> bList = new ArrayList<Byte>(); 
for(String ss : str) { 
    byte[] bArr = ss.getBytes(); 
    for(Byte b : bArr) { 
     bList.add(b); 
    } 
} 
//if you still need an array 
byte[] bArr = new byte[bList.size()]; 
for(int i=0; i<bList.size(); i++) { 
    bArr[i] = bList.get(i); 
} 
0

Cách đơn giản nhất (sử dụng Apache Common Codec):

byte[] bytes = Hex.decodeHex(str.toCharArray()); 
3

Kể từ khi không có câu trả lời cho chuỗi hex để byte đơn chuyển đổi, đây là của tôi: sử dụng

private static byte hexStringToByte(String data) { 
    return (byte) ((Character.digit(data.charAt(0), 16) << 4) 
        | Character.digit(data.charAt(1), 16)); 
} 

mẫu:

hexStringToByte("aa"); // 170 
hexStringToByte("ff"); // 255 
hexStringToByte("10"); // 16 

Hoặc bạn cũng có thể thử các Integer.parseInt(String number, int radix) imo, là cách tốt hơn so với những người khác.

// first parameter is a number represented in string 
// second is the radix or the base number system to be use 
Integer.parseInt("de", 16); // 222 
Integer.parseInt("ad", 16); // 173 
Integer.parseInt("c9", 16); // 201 
+0

Đây là phương pháp tốt nhất cho tôi – doraemon

0
String str[] = {"aa", "55"}; 

byte b[] = new byte[str.length]; 

for (int i = 0; i < str.length; i++) { 
    b[i] = (byte) Integer.parseInt(str[i], 16); 
} 

Integer.parseInt (string, radix) chuyển đổi một chuỗi thành một số nguyên, paramter radix quy định các hệ thống số.

Sử dụng cơ số 16 nếu chuỗi đại diện cho số thập lục phân.
Sử dụng cơ số 2 nếu chuỗi đại diện cho số nhị phân.
Sử dụng một gốc của 10 (hoặc bỏ qua paramter cơ số) nếu chuỗi đại diện cho một số thập phân.

Để biết thêm chi tiết kiểm tra các tài liệu Java: https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#parseInt(java.lang.String,%20int)

+1

Câu trả lời chỉ có mã không giải thích lý do mã hoạt động: vui lòng thêm giải thích cho khách truy cập trong tương lai những gì bạn đã làm để giải quyết vấn đề. –

Các vấn đề liên quan