Go GZIP 刷新并确定大小

标签 go gzip

我正在通过流数据按需创建 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/

相关文章:

reflection - 如何使用反射实现或模拟Go接口(interface)?

去获取 golang 的命令没有响应

go - Cobra COMMAND 未完全执行

go - 为什么在遍历结构片段时无法访问结构字段

gzip - 安卓 Volley : gzip response

hadoop - 使用 Pig 处理没有扩展名的压缩文件

javascript - 提供 JavaScript 文件时,默认 gzip 是否安全

go - 如何填充包含结构数组的嵌套 golang 结构

c# - 从 .ashx 压缩 Javascript 在浏览器中返回解码错误

java - 使用 ISO 字符集压缩文件时,线程 "main"java.util.zip.ZipException : Not in GZIP format. 中出现异常