scala Gzip压缩字符串在java11和java17中给出了不同的结果

kadbb459  于 6个月前  发布在  Scala
关注(0)|答案(1)|浏览(89)

我对字符串test-string应用了gzip压缩。当我将Scala 2.13.8与Java 11.0.13(Java HotSpot(TM)64位服务器虚拟机)一起使用时,它会导致压缩字符串H4sIAAAAAAAAACtJLS7RLS4pysxLBwCFdJByCwAAAA==.
然而,当我在Java 17.0.4.1(OpenJDK 64位服务器虚拟机)上使用Scala 2.13.8执行相同的压缩操作时,它会产生H4sIAAAAAAAA/ytJLS7RLS4pysxLBwCFdJByCwAAAA==.,然而,这两个压缩字符串都正确解压缩以检索原始字符串test-string
我假设这可能取决于几个因素,比如默认压缩级别:Java 11和Java 17的默认压缩级别可能不同,导致相同输入的输出不同。算法改进:Java 17中的Gzip实现可能已经优化,导致不同的压缩结果。内部实现细节:Gzip压缩的内部实现细节可能在Java 11和Java 17之间发生了变化,从而影响了压缩输出。
这背后的原因可能是什么?我附上下面的代码。

val bos = new ByteArrayOutputStream("test-string".length)
val b64os = new Base64OutputStream(bos)
val gzip = new GZIPOutputStream(b64os)
gzip.write("test-string".getBytes("UTF-8"))
gzip.close()
val compressed = new String(bos.toByteArray, "UTF-8")
bos.close()
compressed.trim

字符串

weylhg0b

weylhg0b1#

如果我们用十六进制来查看您的两个输出,我们有这两段数据

1f8b08000000000000ff2b492d2ed12d2e29cacc4b0700857490720b000000
                  ^^
1f8b08000000000000002b492d2ed12d2e29cacc4b0700857490720b000000
                  ^^

字符串
基本上是一个字节从0变成了255(十六进制的ff)。这是gzip格式的OS header,在java 16中从0变成了255,如下所示:https://bugs.openjdk.org/browse/JDK-8244706

相关问题