【问题标题】:Decompressing PHP's gzcompress in Java在Java中解压PHP的gzcompress
【发布时间】:2014-09-30 01:24:02
【问题描述】:

我正在尝试解压缩最初在 PHP 中压缩的 Java 中的 json 对象。以下是它被压缩成 PHP 的方式:

function zip_json_encode(&$arr) {
  $uncompressed = json_encode($arr);
  return pack('L', strlen($uncompressed)).gzcompress($uncompressed);
}

并解码(再次在 PHP 中):

function unzip_json_decode(&$data) {
  $uncompressed = @gzuncompress(substr($data,4));
  return json_decode($uncompressed, $array_instead_of_object);
}

它被放入 MySQL,现在它必须被 Java 从数据库中提取出来。我们将它从ResultSet 中拉出来,如下所示:

String field = rs.getString("field");

然后我将该字符串传递给解压缩它的方法。这就是它崩溃的地方。

private String decompressHistory(String historyString) throws SQLException {
    StringBuffer buffer = new StringBuffer();
    try {
        byte[] historyBytes = historyString.substring(4).getBytes();
        ByteArrayInputStream bin = new ByteArrayInputStream(historyBytes);
        InflaterInputStream in = new InflaterInputStream(bin, new Inflater(true));
        int len;
        byte[] buf = new byte[1024];
        while ((len = in.read(buf)) != -1) {
            // buf should be decoded, right?
        }

    } catch (IOException e) {
        e.getStackTrace();
    }
    return buffer.toString();

}

不太确定这里出了什么问题,但任何指针将不胜感激!

【问题讨论】:

    标签: java php compression gzip zlib


    【解决方案1】:

    你需要去掉Inflater(true)中的true。只使用Inflater()true 使它期望原始的放气数据。如果没有true,则需要 zlib 包装的 deflate 数据。 PHP 的 gzcompress() 生成 zlib 包装的 deflate 数据。

    【讨论】:

      【解决方案2】:

      压缩后的数据是二进制的,字节[]。使用String,Unicode文本,不仅需要转换,而且是错误的。

      例如,这涉及转换:

      byte[] historyBytes = historyString.substring(4).getBytes();
      byte[] historyBytes = historyString.substring(4).getBytes("ISO-8859-1");
      

      第一个版本使用默认平台编码,使应用程序不可移植。

      首先要做的是使用数据库中的二进制数据作为 VARBINARY 或 BLOB。

      ImputStream field = rs.getBinaryStream("field");
      try (InputStream in = new GZIPInputStream(field)) {
          ...
      }
      

      差不多吧。注意其他答案。

      【讨论】:

        【解决方案3】:

        最后,上述解决方案都没有奏效,但都有优点。当我们从 mysql 中提取数据并将其转换为字节时,我们有许多丢失的字符字节 (67)。这使得无法在 java 端解压缩。至于上面的答案。马克是正确的 gzcompress() 使用 zlib,因此您应该在 Java 中使用 Inflater() 类。

        Joop 是正确的,数据转换错误。我们的表太大,无法将其转换为 varbinary 或 blob。 可能解决了问题,但对我们没有用。我们最终让 java 向我们的 PHP 应用程序发出请求,然后简单地在 PHP 端解压缩压缩数据。这运作良好。希望这对偶然发现它的其他人有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多