Подтвердить что ты не робот

Как преобразовать массив байтов с нулевым завершающим символом в String в Java?

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

byte arr[MAX_SIZE];  // Java

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

String str = new String( arr );

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

4b9b3361

Ответ 1

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 по умолчанию. Вероятно, это будет системное значение по умолчанию, но это не гарантируется.

Ответ 2

попробуйте следующее: String s = new String (arr).trim()

Ответ 3

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

String str = new String(arr).split("\0")[0];

Ответ 4

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