Как преобразовать строку Java в массив байтов ASCII?
Как преобразовать строку Java в массив байтов ASCII?
Ответы:
byte[] b = s.getBytes(StandardCharsets.US_ASCII);
Если вы гуаваuser есть удобный 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);
^
Обратите внимание на верхний регистр «String». Это пытается вызвать статический метод для строкового класса, которого не существует. Вместо этого вам нужно вызвать метод в экземпляре строки:
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) и немецкие умляуты. Ответ от Agiles направил меня на правильный путь. Вместо .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();
}
}
}