encode method

List<int> encode(
  1. List<int> data, {
  2. int? level,
  3. OutputStreamBase? output,
})

Implementation

List<int> encode(List<int> data, {int? level, OutputStreamBase? output}) {
  output = output ?? OutputStream(byteOrder: BIG_ENDIAN);

  // Compression Method and Flags
  final cm = DEFLATE;
  final cinfo = 7; //2^(7+8) = 32768 window size

  final cmf = (cinfo << 4) | cm;
  output.writeByte(cmf);

  // 0x01, (00 0 00001) (FLG)
  // bits 0 to 4  FCHECK  (check bits for CMF and FLG)
  // bit  5       FDICT   (preset dictionary)
  // bits 6 to 7  FLEVEL  (compression level)
  // FCHECK is set such that (cmf * 256 + flag) must be a multiple of 31.
  final fdict = 0;
  final flevel = 0;
  var flag = ((flevel & 0x3) << 7) | ((fdict & 0x1) << 5);
  var fcheck = 0;
  final cmf256 = cmf * 256;
  while ((cmf256 + (flag | fcheck)) % 31 != 0) {
    fcheck++;
  }
  flag |= fcheck;
  output.writeByte(flag);

  final adler32 = getAdler32(data);

  final input = InputStream(data, byteOrder: BIG_ENDIAN);

  final compressed = Deflate.buffer(input, level: level).getBytes();
  output.writeBytes(compressed);

  output.writeUint32(adler32);

  output.flush();

  if (output is OutputStream) {
    return output.getBytes();
  }
  return [];
}