去GZIP冲洗并确定尺寸

时间:2018-02-08 11:53:40

标签: go gzip

我正在通过流数据按需创建GZIP,但我需要拆分它,因为接收端有一个硬代码限制。当我Flush()和Close()时,我看到底层字节缓冲区增长了13个字节。我查看了Gzip Close的源代码:

func (z *Writer) Close() error {
    if z.err != nil {
        return z.err
    }
    if z.closed {
        return nil
    }
    z.closed = true
    if !z.wroteHeader {
        z.Write(nil)
        if z.err != nil {
            return z.err
        }
    }
    z.err = z.compressor.Close()
    if z.err != nil {
        return z.err
    }
    le.PutUint32(z.buf[:4], z.digest)
    le.PutUint32(z.buf[4:8], z.size)
    _, z.err = z.w.Write(z.buf[:8])
    return z.err
}

它确实写了一些东西但是有一些东西确定它比仅仅说13个字节更实用吗?可以有标题等我只想拥有一个安全的边距,它是否有可能增长超过13个字节?我可以愉快地设置1kb的保证金并与之共存。

2 个答案:

答案 0 :(得分:2)

据我所知,13个字节是最大值。 8个字节来自gzip页脚,两个PutUint32调用。 另外5个字节由霍夫曼压缩器添加,当压缩机关闭时,该压缩器广告空的最终块。它将为最终的块头添加3位(= 1字节),为长度0添加2个字节,为倒置长度0xffff添加另外2个字节。所以我假设您可以使用这13个字节进行计算。

答案 1 :(得分:1)

gzip压缩输出的保守上限是:

ulong ul = 888UL; if (CmpXchg(ref ul, 999UL, 888UL) != 888UL) throw new Exception("change not accepted");

其中n + ((n + 7) >> 3) + ((n + 63) >> 6) + 23是输入的大小,以字节为单位。