QPacket Compression - zeroKilo/GROBackendWV GitHub Wiki

QPacket Compression

simply zlib compression is used in GRP. the data is preface with a byte, if that is zero, the data is already uncompressed, any other value should be multiplied with the data size to reserve space for decompression.

Example

Example decompression code

`

...
usesCompression = payload[0] != 0;
if (usesCompression)
{
	MemoryStream m2 = new MemoryStream();
	m2.Write(payload, 1, payload.Length - 1);
	payload = Helper.Decompress(m2.ToArray());
}
...

public static byte[] Decompress(byte[] data)
{
	ZlibStream s = new ZlibStream(new MemoryStream(data), Ionic.Zlib.CompressionMode.Decompress);
	MemoryStream result = new MemoryStream();
	s.CopyTo(result);
	return result.ToArray();
}`

Example compression Code

`

...
uint sizeBefore = (uint)tmpPayload.Length;
byte[] buff = Helper.Compress(tmpPayload);
byte count = (byte)(sizeBefore / buff.Length);
if ((sizeBefore % buff.Length) != 0)
	count++;
MemoryStream m2 = new MemoryStream();
m2.WriteByte(count);
m2.Write(buff, 0, buff.Length);
tmpPayload = m2.ToArray();
...

public static byte[] Compress(byte[] data)
{
	ZlibStream s = new ZlibStream(new MemoryStream(data), Ionic.Zlib.CompressionMode.Compress);
	MemoryStream result = new MemoryStream();
	s.CopyTo(result);
	return result.ToArray();
}`