Як перетворити рядок Java на байтовий масив ASCII?
Як перетворити рядок Java на байтовий масив ASCII?
Відповіді:
byte[] b = s.getBytes(StandardCharsets.US_ASCII);
Якщо ви є гуавакористувач є зручний Charsets
клас:
String s = "Hello, world!";
byte[] b = s.getBytes(Charsets.US_ASCII);
Окрім не жорсткого кодування довільного набору символів у вихідному коді, він має набагато більшу перевагу: Charsets.US_ASCII
має Charset
тип (не String
), тому ви уникаєте перевіркиUnsupportedEncodingException
викинутої лише з String.getBytes(String)
, але не з String.getBytes(Charset)
.
У Java 7 існує еквівалентний StandardCharsets
клас.
String.getBytes(Charset)
не був доданий до API 9 :( Отже, якщо ви хочете націлити Froyo і вище, ви не можете цього зробити.
У коді, який ви спробували, є лише один неправильний символ:
Charset characterSet = Charset.forName("US-ASCII");
String string = "Wazzup";
byte[] bytes = String.getBytes(characterSet);
^
Зверніть увагу на верхній регістр "Рядок". Це намагається викликати статичний метод для класу рядків, який не існує. Натомість вам потрібно викликати метод у вашому екземплярі рядка:
byte[] bytes = string.getBytes(characterSet);
getBytes(Charset)
метод вказаний для заміни символів, які неможливо закодувати. Для US-ASCII цей замінюючий символ є знаком питання, тому ваш байтовий масив містить один елемент зі значенням ASCII '?' (63).
Проблема інших запропонованих рішень полягає в тому, що вони або викидають символи, які не можна безпосередньо зіставити з ASCII, або замінюють їх символом маркера, як ?
.
Можливо, ви захочете перетворити, наприклад, символи з наголосом на той самий символ без наголосу. Для цього є кілька хитрощів (включаючи самостійне створення статичної таблиці зіставлення або використання існуючої „нормалізації“, визначеної для Unicode), але ці методи далеко не завершені.
Найкраще скористатися бібліотекою junidecode , яка також не може бути повною, але включає багато досвіду найбільш розумного способу транслітерації Unicode до ASCII.
Якщо вам це потрібно в Android і ви хочете змусити його працювати з чим-небудь старшим, ніж FroYo, ви також можете використовувати EncodingUtils.getAsciiBytes () :
byte[] bytes = EncodingUtils.getAsciiBytes("ASCII Text");
У моєму рядку я маю тайські символи (закодовані TIS620) та німецькі umlauts. Відповідь спритних поставив мене на правильний шлях. Замість .getBytes () я використовую зараз
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;
}
Я знайшов рішення. Насправді клас Base64 недоступний в Android. Посилання наведено нижче для отримання додаткової інформації.
byte[] byteArray;
byteArray= json.getBytes(StandardCharsets.US_ASCII);
String encoded=Base64.encodeBytes(byteArray);
userLogin(encoded);
Ось посилання на клас Base64: http://androidcodemonkey.blogspot.com/2010/03/how-to-base64-encode-decode-android.html
Спробуйте це:
/**
* @(#)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();
}
}
}