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"?
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"?
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}));
@Downvoter bất kỳ nhận xét nào? – Matten
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
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);
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.
+1 để đề cập đến mã hóa –
Để 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
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.
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);
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);
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.
String str = "0x63";
int temp = Integer.parseInt(str.substring(2, 4), 16);
char c = (char)temp;
System.out.print(c);
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