Java tutorial
//package com.java2s; //* Licensed Materials - Property of IBM, Miracle A/S, and * import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.zip.GZIPOutputStream; public class Main { public static void writeCompressedData(ByteArrayOutputStream baos, byte[] data) { byte[] compressed = getCompressedData(data); writeLength(baos, data.length); writeData(baos, compressed); } static byte[] getCompressedData(byte[] data) { ByteArrayOutputStream ser = new ByteArrayOutputStream(); GZIPOutputStream gs; try { gs = new GZIPOutputStream(ser); gs.write(data); gs.close(); } catch (IOException e) { throw new RuntimeException("Cannot compress data", e); } byte[] compressed = ser.toByteArray(); return compressed; } public static void writeLength(ByteArrayOutputStream baos, int len) { if (len < 0) { throw new RuntimeException("Invalid length < 0"); } if (len <= 127) { //MSB = 0 baos.write(len); } else if (len <= 16383) { // MSB = 10 int lowbyte = len % 64; int highbyte = len / 64; baos.write(lowbyte + 128); baos.write(highbyte); } else if (len <= 2097151) { // MSB = 110 int lowbyte = len % 32; int midbyte = (len / 32) % 256; int highbyte = len / 32 / 256; baos.write(lowbyte + 128 + 64); baos.write(midbyte); baos.write(highbyte); } else { throw new RuntimeException("Invalid length > 2^21-1"); } } public static void writeData(ByteArrayOutputStream baos, byte[] data) { writeLength(baos, data.length); baos.write(data, 0, data.length); } }