Странное преобразование байтов в и из строки - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть мини-сервер

byte[] content = fileManager.get(request.getUri());

Здесь я получаю содержимое файлов на сервере
Далее я произвожу компрессию и чанкинг

content = process(content, response);

private byte[] process(byte[] content, Response response) {
    ProcessorList processors = new ProcessorList();
    processors.add(new CompressDelegator(new GZIPCompressor()));
    processors.add(new ChunkDelegator(new Chunker(30)));
    content = processors.process(content, response);
    return content;
}

После этого происходит нечто удивительное Теперь в сжатом и разбитом на части содержимом файла

System.out.println(Arrays.toString(content));
System.out.println(Arrays.toString(new String(content).getBytes()));

Два из них будут печатать разные ответы. Почему?

1 Ответ

0 голосов
/ 06 сентября 2018
new String(content).getBytes()

совершает круговое отключение от byte[] до String до byte[].

Вы конвертируете byte[] в String, используя кодировку JVM по умолчанию. Если byte[] содержит последовательности байтов, которые недопустимы в соответствии с этим набором символов, эти байты не могут быть точно преобразованы в char, поэтому они будут преобразованы в ... что-то, чего вы не ожидаете в String; поэтому они не будут совпадать с входными данными при обратном преобразовании в byte[].

Не делайте этого: String это не логически byte[], это char[]. Если вы хотите передать byte[] в String, сначала сделайте что-то вроде base64-кодирования.

...