Строка инициализации Java из шестнадцатеричного массива - PullRequest
4 голосов
/ 09 марта 2012

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 09 марта 2012

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

  • Использование экранирования Юникод:

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

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

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

2 голосов
/ 09 марта 2012

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

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

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

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

"\u0041\u0042\u0043"
1 голос
/ 09 марта 2012

В 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 s, вы де-факто конвертируете вручную из ASCII).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...