我正在通过流数据按需创建 GZIP,但我需要拆分它,因为接收端有硬代码限制。当我 Flush() 和 Close() 时,我看到底层字节缓冲区增长了 13 个字节。我查看了Gzip的源码关闭:
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 个字节更实用吗?可以有 header 等。我只是想有一个安全的余量,它是否有可能增长到大于 13 字节?我可以愉快地设置 1kb 余量并接受它。
最佳答案
据我所知,13 个字节是最大值。 8 个字节来自 gzip 页脚,即两个 PutUint32
调用。
其他 5 个字节由 huffmann 压缩器添加,当压缩器关闭时,它会添加一个空的最终 block 。它将为最终 block 头添加 3 位(= 1 字节),为长度 0
添加 2 个字节,另外 2 个字节为反转长度 0xffff
。所以我假设你可以用这 13 个字节来计算。
关于Go GZIP 刷新并确定大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48684865/