Преобразование массива строк в байты варьируется в зависимости от Windows и Ubuntu

#java #arrays #byte

#java #массивы #байт

Вопрос:

 public static void main(String args[])
    {       
        byte[] bytearray = new byte[]{1, -30, 48, 50, 49, 48};

        for (int i = 0; i < bytearray.length; i  ) {
            System.out.print(bytearray[i] ", ");
        }
        System.out.println();
        System.out.println("Length of byteArray before : " bytearray.length);

        String st = new String(bytearray);
        System.out.println("String value : "  st);  

        bytearray = st.getBytes();

        for (int i = 0; i < bytearray.length; i  ) {
            System.out.print(bytearray[i] ", ");
        }
        System.out.println();
        System.out.println("Length of byteArray after : " bytearray.length);
    }
  

это моя программа, если я выполняю это в Windows, я получаю точно такие же байты, как и предыдущие, но в ubuntu это дает дополнительные 2 байта, я этого не понял? почему ?

какой метод я должен использовать, чтобы получить такой же массив в ubuntu?

Комментарии:

1. Я думаю, вы можете исправить это, используя тот же набор символов. Вот пример: new String(bytearray, "UTF-8") и str.getBytes("UTF-8") .

Ответ №1:

Извините, я думал, вы используете действительные закодированные данные.

Ваши байты недопустимы в формате UTF-8, поэтому, если у вас разные версии Java, это может обрабатываться по-разному.

 new byte[]{1, -30, 48, 50, 49, 48}
  

Короче говоря, вы должны использовать text для попытки сохранить двоичные данные. Это только запутает вас (и потратит впустую память)

Комментарии:

1. Я работаю над ubuntu, и это вызывает исключение java.io.UnsupportedEncodingException, если я использую стандартные наборы символов. UTF_8

2. @Shailesh Тогда с вашей JVM что-то не так, поскольку это стандартная встроенная кодировка, которую должны иметь все JVM, поэтому она находится в стандартных наборах символов. docs.oracle.com/javase/8/docs/api/index.html?java/nio/charset / … примечание: Если вы используете строку, вы должны написать "UTF-8"

3. по умолчанию используется кодировка utf-8, я пробовал использовать «UTF-8», но все равно это не работает ..! вы уверены, что с моей JVM что-то не так?

4. извините, но я этого не понял ideone.com программа link, как она показывает, что JVM ошибочна?

5. @Shailesh Извините, я понял, в чем проблема. Вы не можете кодировать двоичные данные в виде текста, если вам не нравится путаница (или вы действительно знаете, что делаете) Я настоятельно рекомендую вам избегать попыток сделать это. Разные версии Java и разная кодировка по-разному обрабатывают недопустимые закодированные байты.

Ответ №2:

Вот что говорится в документации для строкового конструктора:

Создает новую строку путем декодирования указанного массива байтов с использованием кодировки платформы по умолчанию.

И что это говорит для getBytes:

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

Итак, почему вы получаете разное поведение в разных системах? Потому что их кодировки по умолчанию отличаются. Вы можете получить кодировку по умолчанию, используя Charset.defaultCharset() .

Комментарии:

1. Я пробовал это, он выдает кодировку по умолчанию как UTF-8, и все еще проблема существует …!

2. Попробуйте использовать String st = новая строка (bytearray, «ISO-8859-1») и bytearray = st.getBytes («ISO-8859-1»)

3. Даже если вы можете это сделать, это, вероятно, будет плохой идеей, если вы не знаете, что байты представляют собой строку, закодированную как ISO-8859-1.