Java: преобразование строки в байтовый массив - PullRequest
1 голос
/ 31 марта 2012

Я получаю некоторые неожиданные результаты от того, что я считал простым тестом. После запуска следующее:

byte [] bytes = {(byte)0x40, (byte)0xE2, (byte)0x56, (byte)0xFF, (byte)0xAD, (byte)0xDC};
String s = new String(bytes, Charset.forName("UTF-8"));
byte[] bytes2 = s.getBytes(Charset.forName("UTF-8"));

bytes2 - это массив из 14 элементов, не похожий на оригинальный (в байтах). Есть ли способ сделать такое преобразование и сохранить исходное разложение в байты?

Ответы [ 3 ]

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

Есть ли способ сделать такое преобразование и сохранить исходное разложение в байты?

Ну, это не похоже на действительный UTF-8 для меня, поэтому я 'Я не удивлен, что это не туда и обратно.

Если вы хотите преобразовать произвольные двоичные данные в текст обратимым образом, используйте base64, например, через этот кодировщик общественного достояния/decoder.

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

Это должно сделать:

public class Main
{

    /*
     * This method converts a String to an array of bytes
     */
    public void convertStringToByteArray()
    {

        String stringToConvert = "This String is 76 characters long and will be converted to an array of bytes";

        byte[] theByteArray = stringToConvert.getBytes();

        System.out.println(theByteArray.length);

    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {    
        new Main().convertStringToByteArray();
    }
}
1 голос
/ 31 марта 2012

Две вещи:

  1. Последовательность байтов не соответствует действительности UTF-8

     $ python
     >>> '\x40\xe2\x56\xff\xad\xdc'.decode('utf8')
     Traceback (most recent call last):
       File "<stdin>", line 1, in <module>
       File "/usr/lib64/python2.7/encodings/utf_8.py", line 16, in decode
         return codecs.utf_8_decode(input, errors, True)
     UnicodeDecodeError: 'utf8' codec can't decode byte 0xe2 in position 1: invalid continuation byte
    
  2. Даже если бы это был действительный код UTF-8, декодирование и последующее кодирование могут приводить к разным байтам из-за таких вещей, как предварительно объединенные символы и другие функции Unicode.

Если вы хотите закодировать произвольные двоичные данные в строку таким образом, чтобы при декодировании вы гарантированно возвращали одни и те же байты, ваша лучшая ставка - что-то вроде base64.

...