2012-03-08 3 views
4

Возможно ли инициализировать строку из массива шестнадцатеричных значений, например, в стиле C?Строка инициализации Java из шестнадцатеричного массива

unsigned char[] charArray = {0x41, 0x42, 0x43}; 

Почему невозможно сделать что-то подобное?

String charArray = new String((byte[]) {0x41, 0x42, 0x43}); 

ответ

3

Возможно, вы можете сделать это несколькими способами.

  • Использование Юникода ускользает:

    String string = "\u0041\u0042\u0043"; 
    
  • Создание и использование массива байтов:

    String string = new String(new byte[] {(byte) 0x41, (byte) 0x42, (byte) 0x43}); 
    

Главное, вы должны помнить о том, что строка не является массив чего-то, это отдельный объект. Поэтому он должен быть либо создан как строковый литерал, либо один из конструкторов.

+0

Спасибо, это именно то, что я искал! – user1019710

1

Там нет беззнаковых типов в Java, так что ваш массив должен содержать регулярные char значения. Тем не менее, числовые литералы по умолчанию имеют тип int, поэтому вам может потребоваться указать ваши значения в char, например: (char)0x41. То же самое относится к значениям byte (используйте тот или иной вариант в зависимости от того, являются ли ваши номера знаками ASCII или Unicode BMP). Вы также можете использовать escape-код unicode, например String str = "\u0041\u0042";. Чтобы получить байтовое представление строки ASCII (или иначе закодированной) (противоположная операция), используйте синтаксис, например: String charArray = "abcd".getBytes("UTF-8");.

Также обратите внимание на различие между байтами и символами. Символ хорошо определен стандартом Unicode и всегда имеет то же значение. Значение байта зависит от используемой кодировки символов, поэтому вы не можете просто сделать строку из байтов. Если вы используете конструктор String(byte[]), вы используете неявное кодирование своей платформы - это может быть опасно в некоторых ситуациях. String(char[]) с другой стороны является безопасным (но если вы генерируете значения char, отличая шестнадцатеричные числа до char, вы де-факто вручную конвертируете из ASCII).

2

Проблема не в String, это с массивами Java и, в частности, байтами.

Вы можете сделать

String charArray = new String(new byte[] {(byte) 0x41, (byte) 0x42, 
    (byte) 0x43}); 

или, еще лучше, вы можете просто написать строку более буквально с ASCII побегами и тому подобными.

"\u0041\u0042\u0043" 
Смежные вопросы