Символ действительно 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 *