为什么“Inflator”算法对 UTF-8 编码失败?

问题描述

为了解压缩使用 Deflator 算法压缩的消息,我编写了以下代码

  def decompressMsg[V: StringDecoder](msg: String): Try[V] = {
    if (msg.startsWith(CompressionHeader)) {
      logger.debug(s"Message before decompression is: ${msg}")
      val compressedByteArray =
        msg.drop(CompressionHeader.length).getBytes(StandardCharsets.UTF_8)
      val inflaterInputStream = new InflaterInputStream(
        new ByteArrayInputStream(compressedByteArray)
      )
      val decompressedByteArray = readDataFromInflaterInputStream(inflaterInputStream)

      StringDecoder.decode[V](new String(decompressedByteArray,StandardCharsets.UTF_8).tap {
        decompressedMsg => logger.info(s"Message after decompression is: ${decompressedMsg}")
      })
    } else {
      StringDecoder.decode[V](msg)
    }
  }

private def readDataFromInflaterInputStream(
      inflaterInputStream: InflaterInputStream
  ): Array[Byte] = {
    val outputStream = new ByteArrayOutputStream
    var runLoop = true
    while (runLoop) {
      val buffer = new Array[Byte](BufferSize)
      val len = inflaterInputStream.read(buffer) // ERROR IS THROWN FROM THIS LINE!!
      outputStream.write(buffer,len)
      if (len < BufferSize) runLoop = false
    }
    outputStream.toByteArray
  }

输入参数 'msg' 是使用 Deflator 压缩的。上面的代码失败并显示错误消息:

无效的存储块长度 java.util.zip.ZipException: invalid 存储块长度

在我看到 this thread 后,我将 StandardCharsets.UTF_8 更改为 StandardCharsets.ISO_8859_1,令人惊讶的是,代码通过并返回了所需的行为。

我不想使用不同于 UTF_8 的编码。你知道如何让我的代码使用 UTF_8 编码吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...