我正在通过流数据按需创建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的保证金并与之共存。
答案 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
是输入的大小,以字节为单位。