2011-12-28 54 views
13

tôi sử dụng mã dưới đây để chuyển đổi byte để chuỗi:Chuyển đổi byte để chuỗi trong Java

System.out.println("string " + Byte.toString((byte)0x63)); 

Tại sao nó in "chuỗi 99". Làm thế nào để sửa đổi để cho nó in "chuỗi c"?

+0

Không thể * chỉ * chuyển đổi byte thành chuỗi.[Bạn phải sử dụng mã hóa ký tự] (http://stackoverflow.com/questions/10611455/what-is-character-encoding). – Raedwald

Trả lời

13

Chuỗi ctor là thích hợp cho việc chuyển đổi này:

System.out.println("string " + new String(new byte[] {0x63})); 
+0

@Downvoter bất kỳ nhận xét nào? – Matten

+1

Vì câu trả lời của gustafc có một điểm rất quan trọng: String (byte []) constructor sử dụng mã hóa mặc định của hệ thống để chuyển đổi mảng byte thành các ký tự String. Người ta không nên giả định rằng một giá trị byte 0x63 được ánh xạ tới chữ 'c'. Ví dụ, trong UTF-16, chữ cái 'c' được biểu thị bằng 2 byte mã hóa, không phải là một byte. Bài đăng trên blog này mô tả chi tiết về điều này: http://www.joelonsoftware.com/articles/Unicode.html – tbacker

3

Bạn có thể sử dụng printf:

System.out.printf("string %c\n", 0x63); 

Bạn cũng có thể tạo một String với định dạng như vậy, sử dụng String#format:

String s = String.format("string %c", 0x63); 
+0

Có thể chuyển đổi thành chuỗi không? – brian

+0

Có, xem chỉnh sửa của tôi – MByD

32
System.out.println(new String(new byte[]{ (byte)0x63 }, "US-ASCII")); 

Lưu ý đặc biệt là chuyển đổi byte sang Strings luôn luôn liên quan đến mã hóa. Nếu bạn không chỉ định nó, bạn sẽ sử dụng mã hóa mặc định nền tảng, có nghĩa là mã có thể bị hỏng khi chạy trong các môi trường khác nhau.

+2

+1 để đề cập đến mã hóa –

+10

Để tránh kiểm tra 'UnsupportedEncodingException' được kiểm tra bởi hàm tạo mà bạn có thể muốn chuyển vào [' StandardCharsets.US_ASCII'] (http://docs.oracle.com/javase/7/docs/api/java/nio/charset/StandardCharsets.html#US_ASCII) thay vì sử dụng tên bộ ký tự. – gustafc

2

Bạn phải tạo chuỗi mới ra khỏi mảng byte. Phần tử đầu tiên trong số byteArray của bạn phải là 0x63. Nếu bạn muốn thêm bất kỳ chữ cái nào khác, hãy đặt dài hơn byteArray và thêm chúng vào chỉ mục tiếp theo.

byte[] byteArray = new byte[1]; 
byteArray[0] = 0x63; 

try { 
    System.out.println("string " + new String(byteArray, "US-ASCII")); 
} catch (UnsupportedEncodingException e) { 
    // TODO: Handle exception. 
    e.printStackTrace(); 
} 

Lưu ý rằng việc chỉ định mã hóa cuối cùng sẽ ném UnsupportedEncodingException và bạn phải xử lý điều đó cho phù hợp.

1

Nếu đó là một byte, chỉ cần đúc byte đến char và sẽ hoạt động tốt, tức là cung cấp cho đối tượng char tương ứng với giá trị điểm của byte đã cho. Nếu không, hãy sử dụng hàm tạo String như được đề cập ở nơi khác.

char ch = (char)0x63; 
System.out.println(ch); 
3

bạn có thể sử dụng

các nhân vật tương đương với 0x63 là 'c' nhưng byte tương đương với nó là 99

System.out.println("byte "+(char)0x63); 
9

Sử dụng char thay vì byte:

System.out.println("string " + (char)0x63); 

Hoặc nếu bạn muốn trở thành một thanh công cụ Unicode, bạn sử dụng các điểm mã:

System.out.println("string " + new String(new int[]{ 0x63 }, 0, 1)); 

Và nếu bạn thích Skool cũ US-ASCII "mỗi byte là một nhân vật" ý tưởng:

System.out.println("string " + new String(new byte[]{ (byte)0x63 }, 
              StandardCharsets.US_ASCII)); 

Tránh sử dụng String(byte[]) constructor đề nghị trong câu trả lời khác; nó dựa vào bộ ký tự mặc định. Các trường hợp có thể phát sinh ở nơi 0x63 thực sự không phải là ký tự c.

1
String str = "0x63"; 
int temp = Integer.parseInt(str.substring(2, 4), 16); 
char c = (char)temp; 
System.out.print(c); 
Các vấn đề liên quan