如何处理来自消息体API响应的GZIP字符串?



我正在使用一个返回GZIP字符串的系统(不是二进制或流)。例如,gzip:H4sIAAAAAAAAALS9665wyXEd9i7zm21U37vnVwwZAREEAZJYgBEjMKq6uiVLNimQlBDRyLtnrX3GD+ACIlEDznyaffbpXV21Vl1W/bdf/vKv/3R/+fWXf/4n17/cX373y/l7/cPfXf+3f/nl1zxWrmW2Vfeev/vlL/p3f/7l1//4f//uF7vvj3+6f/unP/zy63/75T/9p//+CPz97375F/0v//zb3/2q/1X/+sc...(必须省略整个字符串,因为它很长)。我能够验证其GZIP压缩,因为https://www.multiutil.com/gzip-to-text-decompress/等工具返回预期的未压缩字符串。

然而,我试图找到一种方法来处理这个字符串在Java。

我试过了

final GZIPInputStream gzipInput = new GZIPInputStream(new ByteArrayInputStream(compressedString.getBytes()));

但是这行是抛出java.util.zip.ZipException: Not in GZIP format

我在这里搜索过,但是类似的帖子是关于GZIP何时在http响应中并且可以从流中读取。在我的情况下,我的GZIP数据已经作为字符串给了我。

请指教,谢谢。

This:

H4sIAAAAAAAACvNIzcnJVwjPL8pJAQBWsRdKCwAAAA = =

是Base64。这是一种编码,允许您将字节置于字符形式,这样字符就可以在任何和所有纯文本媒体中存活。

效率极低,膨胀你的数据大小:每3个字节需要4个字符(所以,至少4个字节的传输)。

你在这里看到的可能是经过这个过程的数据:

  • 首先,GZip此数据。
  • 第二,Base64压缩数据。

这很奇怪-首先,有效地存储它,然后,非常低效地发送它。只有当它在不能处理字节的媒体(如基本JSON或HTTP头)中才有意义,然后您可能想要考虑这种媒体。

无论如何,要返回到原始数据,应用相同的步骤,反过来:

  • 首先,去base64,它给你一个字节数组。
  • 接下来,将其作为ByteArrayInputStream的基础,并将其扔给GZIPInputStream。

Base64被嵌入java。

byte[] compressedData = Base64.getDecoder().decode("H4sIAAAAAAAACvNIzcnJVwjPL8pJAQBWsRdKCwAAAA=="));
var gz = new GZIPInputStream(new ByteArrayInputStream(compressedData));

相关内容

  • 没有找到相关文章

最新更新