Làm thế nào để chuyển đổi một chuỗi Java thành một mảng byte ASCII?
Làm thế nào để chuyển đổi một chuỗi Java thành một mảng byte ASCII?
Câu trả lời:
byte[] b = s.getBytes(StandardCharsets.US_ASCII);
Nếu bạn là một trái ổingười dùng có một Charsets
lớp tiện dụng :
String s = "Hello, world!";
byte[] b = s.getBytes(Charsets.US_ASCII);
Ngoài việc không phải mã hóa cứng tên bộ ký tự tùy ý trong mã nguồn của bạn, nó còn có một lợi thế lớn hơn nhiều: Charsets.US_ASCII
thuộc Charset
loại (không phải String
), do đó bạn tránh được chọn UnsupportedEncodingException
chỉ ném từ String.getBytes(String)
chứ không phải từ String.getBytes(Charset)
.
Trong Java 7 có StandardCharsets
lớp tương đương .
String.getBytes(Charset)
không được thêm vào cho đến khi API 9 :( Vì vậy, nếu bạn muốn nhắm mục tiêu Froyo trở lên, bạn không thể làm điều đó.
Chỉ có một ký tự sai trong mã bạn đã thử:
Charset characterSet = Charset.forName("US-ASCII");
String string = "Wazzup";
byte[] bytes = String.getBytes(characterSet);
^
Lưu ý chữ hoa "String". Điều này cố gắng gọi một phương thức tĩnh trên lớp chuỗi, phương thức này không tồn tại. Thay vào đó, bạn cần gọi phương thức trên phiên bản chuỗi của mình:
byte[] bytes = string.getBytes(characterSet);
getBytes(Charset)
phương pháp được chỉ định để thay thế các ký tự không thể mã hóa. Với US-ASCII, ký tự thay thế này là dấu chấm hỏi, vì vậy mảng byte của bạn chứa một phần tử có giá trị ASCII là '?' (63).
Vấn đề với các giải pháp được đề xuất khác là chúng sẽ loại bỏ các ký tự không thể ánh xạ trực tiếp tới ASCII hoặc thay thế chúng bằng một ký tự đánh dấu như ?
.
Bạn có thể muốn chuyển đổi các ký tự có dấu ví dụ thành cùng một ký tự không dấu. Có một vài thủ thuật để thực hiện việc này (bao gồm tự xây dựng bảng ánh xạ tĩnh hoặc tận dụng 'chuẩn hóa' hiện có được xác định cho unicode), nhưng những phương pháp đó vẫn chưa hoàn thiện.
Đặt cược tốt nhất của bạn là sử dụng thư viện junidecode , thư viện này cũng không thể hoàn chỉnh nhưng kết hợp nhiều kinh nghiệm theo cách chuyển ngữ Unicode sang ASCII một cách lành mạnh nhất.
Nếu bạn cần điều này trong Android và muốn làm cho nó hoạt động với bất kỳ thứ gì cũ hơn FroYo, bạn cũng có thể sử dụng EncodingUtils.getAsciiBytes () :
byte[] bytes = EncodingUtils.getAsciiBytes("ASCII Text");
Trong chuỗi của tôi, tôi có các ký tự tiếng Thái (được mã hóa TIS620) và âm sắc tiếng Đức. Câu trả lời từ agiles đưa tôi vào con đường đúng đắn. Thay vì .getBytes () tôi sử dụng bây giờ
int len = mString.length(); // Length of the string
byte[] dataset = new byte[len];
for (int i = 0; i < len; ++i) {
char c = mString.charAt(i);
dataset[i]= (byte) c;
}
Tôi đã tìm ra giải pháp. Trên thực tế, lớp Base64 không có sẵn trong Android. Liên kết được cung cấp dưới đây để biết thêm thông tin.
byte[] byteArray;
byteArray= json.getBytes(StandardCharsets.US_ASCII);
String encoded=Base64.encodeBytes(byteArray);
userLogin(encoded);
Đây là liên kết cho lớp Base64: http://androidcodemonkey.blogspot.com/2010/03/how-to-base64-encode-decode-android.html
Thử cái này:
/**
* @(#)demo1.java
*
*
* @author
* @version 1.00 2012/8/30
*/
import java.util.*;
public class demo1
{
Scanner s=new Scanner(System.in);
String str;
int key;
void getdata()
{
System.out.println ("plase enter a string");
str=s.next();
System.out.println ("plase enter a key");
key=s.nextInt();
}
void display()
{
char a;
int j;
for ( int i = 0; i < str.length(); ++i )
{
char c = str.charAt( i );
j = (int) c + key;
a= (char) j;
System.out.print(a);
}
public static void main(String[] args)
{
demo1 obj=new demo1();
obj.getdata();
obj.display();
}
}
}