Подтвердить что ты не робот

Представление char в виде байта в Java

Я должен преобразовать char в байтовый или байтовый массив. На других языках я знаю, что char - это всего лишь один байт. Однако, глядя на класс Java Character, его минимальное значение -\u0000, а его максимальное значение -\uFFFF. Похоже, что char имеет длину 2 байта.

Смогу ли я сохранить его в виде байта или мне нужно сохранить его в виде двух байтов?

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

Пожалуйста, дайте мне знать и помогите мне понять это.

Спасибо, JBU

4b9b3361

Ответ 1

Чтобы преобразовать символы в байты, необходимо указать кодировку символов. Некоторые кодировки символов используют один байт на символ, в то время как другие используют два или более байтов. Фактически, для многих языков слишком много символов, чтобы кодировать их одним байтом.

В Java самый простой способ преобразования символов в байты - использовать getBytes(Charset) класса String. (Класс StandardCharsets определяет некоторые распространенные кодировки.) Однако этот метод автоматически заменяет символы на , если символ не может быть отображен в указанной кодировке. Если вам нужно больше контроля, вы можете настроить CharsetEncoder для обработки этого случая с ошибкой или использовать другой символ замены.

Ответ 2

A char действительно 16 бит в Java (и также является единственным неподписанным типом!!).

Если вы уверены, что кодировка ваших символов ASCII, вы можете просто отбросить их на байт (поскольку ASCII использует только более низкие 7 бит char).

Если вам не нужно изменять символы или понимать их значение внутри строки, вы можете просто сохранить символы в двух байтах, например:

char[] c = ...;
byte[] b = new byte[c.length*2];
for(int i=0; i<c.length; i++) {
    b[2*i] = (byte) (c[i]&0xFF00)>>8; 
    b[2*i+1] = (byte) (c[i]&0x00FF); 
}

(Может быть целесообразно заменить 2 * на правый сдвиг, если скорость имеет значение).

Обратите внимание, что некоторые фактические (отображаемые) символы (или, точнее, кодовые коды Unicode) записываются на двух последовательных символах. Таким образом, резка между двумя символами не гарантирует, что вы сокращаете фактические символы.

Если вам нужно декодировать/кодировать или иным образом манипулировать массивом char в стиле String, вам лучше попытаться декодировать и закодировать массив char или String с помощью инструментов java.io, которые гарантируют надлежащее манипуляции с персонажами.

Ответ 3

Чтобы расширить то, что говорят другие, если у вас есть char, который вам нужен как массив байтов, сначала создайте String, содержащий этот char, а затем получите массив байтов из строки:

private byte[] charToBytes(final char x) {
  String temp = new String(new char[] {x});
  try {
    return temp.getBytes("ISO-8859-1");
  } catch (UnsupportedEncodingException e) {
    // Log a complaint
    return null;
  }
}

Конечно, используйте соответствующий набор символов. Гораздо эффективнее, что это должно было бы начать работать со строками, а не принимать char за один раз, преобразовать в String, а затем преобразовать в массив байтов.

Ответ 4

char в java - это значение без знака 16 бит. Если то, что у вас есть, поместится в 7 бит, тогда просто сделайте приведение к байту (например, ASCII подойдет).

Вы можете проверить API java.nio.charset.

Ответ 5

Character.toString(chr).getBytes(charset)