package com.faforever.client.remote.io; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.Arrays; import java.util.zip.Deflater; import java.util.zip.DeflaterOutputStream; import java.util.zip.Inflater; import java.util.zip.InflaterOutputStream; /** * Utility class that compresses and uncompresses bytes like QT's <a href="http://doc.qt.io/qt-5/qbytearray.html">QByteArray</a>. */ public final class QtCompress { private QtCompress() { throw new AssertionError("Not instantiatable"); } /** * Compresses the specified bytes like <a href="http://doc.qt.io/qt-5/qbytearray.html#qCompress">QByteArray.qCompress()</a> * does. */ public static byte[] qUncompress(byte[] bytes) throws IOException { Inflater inflater = new Inflater(); inflater.setInput(Arrays.copyOfRange(bytes, 4, bytes.length)); ByteArrayOutputStream byteArray = new ByteArrayOutputStream(); try (InflaterOutputStream inflaterOutputStream = new InflaterOutputStream(byteArray, inflater)) { inflaterOutputStream.flush(); } return byteArray.toByteArray(); } /** * Uncompresses the specified bytes like <a href="http://doc.qt.io/qt-5/qbytearray.html#qCompress">QByteArray.qCompress()</a> * does. */ public static byte[] qCompress(byte[] bytes) throws IOException { Deflater deflater = new Deflater(); deflater.setInput(bytes); ByteArrayOutputStream byteArray = new ByteArrayOutputStream(); new DataOutputStream(byteArray).writeInt(bytes.length); try (DeflaterOutputStream deflaterOutputStream = new DeflaterOutputStream(byteArray, deflater, true)) { deflaterOutputStream.flush(); } return byteArray.toByteArray(); } }