代码之家  ›  专栏  ›  技术社区  ›  CrazySynthax

为什么“充气器”算法无法进行UTF-8编码?

  •  0
  • CrazySynthax  · 技术社区  · 3 年前

    我编写了以下代码,以便解压缩使用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, 0, len)
          if (len < BufferSize) runLoop = false
        }
        outputStream.toByteArray
      }
    

    输入参数“msg”是使用平减指数压缩的。上述代码失败,并显示错误消息:

    java中存储的块长度无效。util。拉链ZipException:无效 存储块长度

    在我看到 this thread ,我换了标准字符集。UTF_8至标准字符集。ISO_8859_1,令人惊讶的是,代码传递并返回了所需的行为。

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

    0 回复  |  直到 3 年前