Java распаковка массива байтов
На сервере (C++) двоичные данные сжимаются с помощью функции ZLib
:
compress2()
И он передается клиенту (Java). На стороне клиента (Java) данные должны быть распакованы с использованием следующего фрагмента кода:
public static String unpack(byte[] packedBuffer) {
InflaterInputStream inStream = new InflaterInputStream(new ByteArrayInputStream( packedBuffer);
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
int readByte;
try {
while((readByte = inStream.read()) != -1) {
outStream.write(readByte);
}
} catch(Exception e) {
JMDCLog.logError(" unpacking buffer of size: " + packedBuffer.length);
e.printStackTrace();
// ... the rest of the code follows
}
Проблема в том, что когда он пытается читать в цикле while, он всегда бросает:
Java.утиль.застежка-молния.ZipException: недопустимые длины хранимых блоков
Прежде чем я проверю другие возможные причины, может кто-нибудь, пожалуйста, сказать мне, могу ли я сжать на одной стороне с compress2 и распаковать его с другой стороны, используя приведенный выше код, так что я могу устранить эту проблему? Кроме того, если у кого-то есть возможная подсказка о том, что может быть неправильно Здесь (я знаю, что не предоставил слишком много кода здесь, но проекты довольно большие.
Спасибо.
2 ответа:
InflaterInputStream
ожидает необработанные дефляционные данные (RFC 1951 ), в то время какcompress2()
производит zlib-обернутые дефляционные данные (RFC 1950 вокруг RFC 1951).
Inflater
с другой стороны, обрабатывает данные в zlib-оболочке (если вы не даете ему опциюnowrap
). Иди разберись.
Я думаю, что проблема не в методе распаковки, а в содержимом packedBuffer. Распаковать работает нормально
public static byte[] pack(String s) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); DeflaterOutputStream dout = new DeflaterOutputStream(out); dout.write(s.getBytes()); dout.close(); return out.toByteArray(); } public static void main(String[] args) throws Exception { byte[] a = pack("123"); String s = unpack(a); // calls your unpack System.out.println(s); }
Вывод
123