Странное преобразование байтов в и из строки
У меня мини сервер
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 ответ
new String(content).getBytes()
кругосветное byte[]
к String
к byte[]
,
Вы конвертируете byte[]
к String
используя кодировку JVM по умолчанию. Если byte[]
содержит последовательности байтов, которые недопустимы в соответствии с этим набором символов, эти байты не могут быть точно преобразованы в char
поэтому они будут преобразованы в... то, чего вы не ожидаете в String
; поэтому они не будут совпадать с входными данными при обратном преобразовании в byte[]
,
Не делай этого: String
не является логически byte[]
, это char[]
, Если вы хотите передать byte[]
в String
, сначала сделайте что-нибудь вроде base64-кодирования.