如何从Memcache转储给定键的压缩对象?

问题描述 投票:0回答:1

我正在使用以下命令从memcached转储给定键的压缩对象:

cat <(printf "\x1f\x8b\x08\x00\x00\x00\x00\x00") <(memccat CACHE-KEY) | gunzip

它打印值(一个JSON),但最后有警告:

gzip:stdin:意外的文件结束

我相信它可能会丢失最后4个字节的校验和(ADLER32),但我不确定。

从Memcached缓存服务以纯文本格式转储压缩键值的正确方法是什么?

shell memcached zlib gunzip igbinary
1个回答
1
投票

看起来memccat CACHE-KEY的结果是zlib(RFC 1950)流。您正在为gzip流(RFC 1952)的gzip标头的十个字节中的八个作为前缀提供,这导致gunzip将双字节zlib标头作为gzip标头末尾缺少的两个字节。 gunzip然后期待一个放气流(RFC 1951),它正在获得,然后是一个gzip预告片,它没有得到。 gzip预告片是8个字节,由CRC-32和未压缩数据的长度组成。相反,它正在获取zlib预告片,它是未压缩数据的四字节Adler-32。

为了使gunzip饱和,你需要不给它zlib流的最后四个字节,用8个字节替换它,你需要计算未压缩数据的CRC-32,以及未压缩数据的长度。但这有点愚蠢,因为这些事情的重点是对未压缩数据的完整性检查。

您真正想要做的是将zlib流解释为zlib流,最后将使用Adler-32作为完整性检查。您可以使用pigz使用pigz -dz解码zlib流,或者您可以使用zlib轻松编写自己的zlib解码器。示例目录中提供了一个名为zpipe的示例。

© www.soinside.com 2019 - 2024. All rights reserved.