Представление char как байта в Java - PullRequest
24 голосов
/ 31 марта 2009

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

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

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

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

Спасибо, JBU

Ответы [ 4 ]

35 голосов
/ 31 марта 2009

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

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

8 голосов
/ 31 марта 2009

Символ действительно 16-битный в Java (и это также единственный тип без знака !!).

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

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

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) записываются в двух последовательных символах. Таким образом, обрезка между двумя символами не гарантирует, что вы обрезаете между действительными символами.

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

4 голосов
/ 31 марта 2009

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

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;
  }
}

Конечно, используйте соответствующий набор символов. Намного эффективнее было бы начать работать со строками, а не брать символ за раз, преобразовать в строку, а затем преобразовать в байтовый массив.

0 голосов
/ 31 марта 2009

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

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

...