我有一个字符串,但我不知道编码类型。
原始数据如下:
{
"securityProxyResponseEnvelope":{
"resultCode":"OK",
"apiResponse":"{zlibe}9mtdE350h9rd4h7wlFX3AkeCtNsb40FFaEZAl/CfcNNKrhGXawhgAs2rI4rnEgIwLpgJkKl+qkB0kzJ6+ZFmmz12Pl9/9MPdA1unUKL5OdHcWmAZim3ZjDXFGCW4zruCS/IOSiU1qVKAF5qIbocB4+2rAF7zH18SRtmXM8YW3eYs5w1NPjmYkM31W8x7QvrKkzFscH3kqDwmYn0I2gNNOtfwuKjWd5snunyqxPopZHNX3CBdW/pj4+N0tJXjAoHorCe8Ypmjxnvh3zthkLTbiBLgeULH1hGvVtkI0C9PGMyt/92upVW6qHxqCYoO/LTJK1tq6OpBnMRBNZDDntSRkrzp+1RpvzbBxFtwQ9jh45eSthbG5hq+D2oJkW5zrGi6TM8eG4ztCqRoO9dEvz2JbQsDCTPz70+C6iPYdkvOyqji18ysLjBbGcHw1j45YItcurVxp0FChxXrnHZwu6m430xKEp7ONxvgEZurt3T8qAjrkrbHfd8jRjDydUXYsMoa",
"session":"n3qp6jzHwZkXWSMW3VBF:jitqBjBmlZbrgcEgY7Od",
"parameters":{
}
}
}
我想解压
data['securityProxyResponseEnvelope']['apiResponse']
中的字符串。
这就是我正在做的:
@clear_string_from_data = '9mtdE350h9rd4h7wlFX3AkeCtNsb40FFaEZAl/CfcNNKrhGXawhgAs2rI4rnEgIwLpgJkKl+qkB0kzJ6+ZFmmz12Pl9/9MPdA1unUKL5OdHcWmAZim3ZjDXFGCW4zruCS/IOSiU1qVKAF5qIbocB4+2rAF7zH18SRtmXM8YW3eYs5w1NPjmYkM31W8x7QvrKkzFscH3kqDwmYn0I2gNNOtfwuKjWd5snunyqxPopZHNX3CBdW/pj4+N0tJXjAoHorCe8Ypmjxnvh3zthkLTbiBLgeULH1hGvVtkI0C9PGMyt/92upVW6qHxqCYoO/LTJK1tq6OpBnMRBNZDDntSRkrzp+1RpvzbBxFtwQ9jh45eSthbG5hq+D2oJkW5zrGi6TM8eG4ztCqRoO9dEvz2JbQsDCTPz70+C6iPYdkvOyqji18ysLjBbGcHw1j45YItcurVxp0FChxXrnHZwu6m430xKEp7ONxvgEZurt3T8qAjrkrbHfd8jRjDydUXYsMoa'
@decoded = Base64.decode64(@clear_string_from_data)
@inflated = Zlib::Inflate.inflate(@decoded)
但这又回来了
#=> Zlib::DataError: incorrect header check
造成这种情况的原因是什么以及接下来我可以尝试什么来解压缩数据?
当我尝试对尚未被 Zlib 压缩的数据调用 inflate 时,我得到了这个信息。 就我而言,它用于单元测试,我发送了一个纯字符串,只是忘记先调用 .deflate 。
在您的情况下,如果您这样做,则不会收到错误:
@decoded = Zlib::Deflate.deflate(@clear_string_from_data)
@inflated = Zlib::Inflate.inflate(@decoded)
造成这种情况的原因是它不是 zlib 数据。 您应该询问生成原始数据的人。
Zlib::GzipReader 专为解压缩已使用 Gzip 压缩格式压缩的数据而设计。 Gzip 是一种广泛使用的文件和流压缩格式。如果您的数据是 Gzip 压缩的,那么这是合适的选择。
result = Zlib::GzipReader.new(StringIO.new(response.to_s)).read
Zlib::Inflate inflate 是一种更通用的解压方法。它可以处理 Zlib 库支持的各种压缩格式,包括 Gzip、Deflate 等。如果您的数据是使用 Gzip 以外的格式压缩的,则此方法允许您处理它。
result = Zlib::Inflate.inflate(response)
这是一个非常令人不满意的答案(因为它没有给出原因的解释)。但我使用的是 Rails 6.1,并且已经很长一段时间(至少有几年)没有更新 gems 了。我这样做了,Zlib 问题就消失了。我真的很抱歉这是一个非技术性的答案,但我把它放在这里是因为它可能是最实用的解决方案(就我而言)。