Преобразование char[] в Byte[]


Я хотел бы преобразовать массив символов в массив байтов в Java. Какие существуют методы для этого преобразования?

6 63

6 ответов:

char[] ch = ?
new String(ch).getBytes();

или

new String(ch).getBytes("UTF-8");

чтобы получить кодировку не по умолчанию.

обновление: Начиная С Java 7: new String(ch).getBytes(StandardCharsets.UTF_8);

преобразование без создания

Edit: ответ Андрея был обновлен, поэтому следующее больше не применяется.

ответ Андрея (самый высокий голос на момент написания статьи) немного неправильный. Я бы добавил Это как комментарий, но я не являюсь достаточно надежным.

в ответе Андрея:

char[] chars = {'c', 'h', 'a', 'r', 's'}
byte[] bytes = Charset.forName("UTF-8").encode(CharBuffer.wrap(chars)).array();

вызов array () может не возвращать желаемое значение, например:

char[] c = "aaaaaaaaaa".toCharArray();
System.out.println(Arrays.toString(Charset.forName("UTF-8").encode(CharBuffer.wrap(c)).array()));

выход:

[97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0]

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

char[] c = "aaaaaaaaaa".toCharArray();
ByteBuffer bb = Charset.forName("UTF-8").encode(CharBuffer.wrap(c));
byte[] b = new byte[bb.remaining()];
bb.get(b);
System.out.println(Arrays.toString(b));

выход:

[97, 97, 97, 97, 97, 97, 97, 97, 97, 97]

как ответ также намекал на использование паролей это может стоить гашение массива, который поддерживает ByteBuffer (доступ через массив (функция)):

ByteBuffer bb = Charset.forName("UTF-8").encode(CharBuffer.wrap(c));
byte[] b = new byte[bb.remaining()];
bb.get(b);
blankOutByteArray(bb.array());
System.out.println(Arrays.toString(b));
private static byte[] charArrayToByteArray(char[] c_array) {
        byte[] b_array = new byte[c_array.length];
        for(int i= 0; i < c_array.length; i++) {
            b_array[i] = (byte)(0xFF & (int)c_array[i]);
        }
        return b_array;
}

на самом деле char и byte могут иметь разный размер в Java, так как char может содержать любой символ Юникода, который может доходить до 16 бит.

вы могли бы сделать метод:

public byte[] toBytes(char[] data) {
byte[] toRet = new byte[data.length];
for(int i = 0; i < toRet.length; i++) {
toRet[i] = (byte) data[i];
}
return toRet;
}

надеюсь, что это помогает