#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.