Как преобразовать байтовый массив с завершающим нулем символом в строку в Java? - PullRequest
25 голосов
/ 13 января 2012

Как я могу создать объект String из байтового массива

byte arr[MAX_SIZE];  // Java

, где один из элементов массива является завершающим байтом C null?Это так же просто, как вызов

String str = new String( arr );

Знает ли конструктор String, что он автоматически останавливается на нулевом завершающем символе?Любые байты после нулевого байта являются (возможно) мусорными символами, которые я не хочу включать в строку.Последний ответ в разделе Анализ байтового массива, содержащий поля неизвестной длины , предлагает циклически проходить по массиву и вручную находить нулевой символ завершения, но мне было интересно, будет ли конструктор String делать это автоматически.Я также предполагаю, что системная кодировка по умолчанию будет использоваться на всех концах.

Ответы [ 4 ]

21 голосов
/ 13 января 2012
byte arr[] = ...
Charset charset = ...
int i;
for (i = 0; i < arr.length && arr[i] != 0; i++) { }
String str = new String(arr, 0, i, charSet);

Примечания:

  • Обычно рекомендуется использовать явный параметр CharSet, чтобы приложение не зависело от набора символов / кодировки платформы по умолчанию.

  • Это не будет работать для некоторых кодировок.Например, строка в кодировке UTF-16 не может быть безопасно представлена ​​в виде последовательности байтов с нулевым символом в конце, поскольку многие кодовые единицы содержат нулевые байты.(С другой стороны, UTF-8 в порядке, при условии, что строка не содержит экземпляров нулевой точки кода; см. Может ли UTF-8 содержать нулевой байт? )

... но мне было интересно, будет ли конструктор String делать это автоматически.

Нет, они не будут.(Не «удивляйтесь» ... прочитайте javadoc: -))

Я также предполагаю, что системная кодировка по умолчанию будет использоваться на всех концах.

ЕслиВы не указываете кодировку, будет использоваться платформа Java по умолчанию.Скорее всего, это будет system default, но это не гарантируется.

10 голосов
/ 13 января 2012

как насчет этого:

String str = new String(arr).split("\0")[0];
9 голосов
/ 20 ноября 2015

попробуйте это: Строка s = новая строка (обр) .trim ()

4 голосов
/ 13 января 2012

Он волшебным образом не остановится на нулевом терминаторе.Нулевой символ не завершает строки в Java.Вам нужно будет найти индекс первого нулевого символа и остановиться на этом.Используйте конструктор String(byte[] arr, int offset, length) после этого.

...