【问题标题】:Deflate in Java, Inflate in Javascript, Z_DATA_ERRORJava 中的 Deflate,Javascript 中的 Inflate,Z_DATA_ERROR
【发布时间】:2017-11-17 13:44:07
【问题描述】:

我需要在 java 中对一些文本进行压缩,使用 WebSockets 将其发送到 NodeJS,然后在 NodeJS 中对其进行充气。

我在 Java 中使用此代码在 Java 中制作压缩的 UTF-8 字符串

public static String compress(String s) throws UnsupportedEncodingException 
{
    Deflater def = new Deflater(9);
    byte[] sbytes = s.getBytes(StandardCharsets.UTF_8);
    def.setInput(sbytes);
    def.finish();
    byte[] buffer = new byte[sbytes.length];
    int n = def.deflate(buffer);
    return new String(buffer, StandardCharsets.UTF_8);
            //+ "*" + sbytes.length;
    //return Base64.encode(buffer);
}

这段代码在Javascript中解压

zlib.inflate(new Buffer(message, "utf8"), function(err, data){
    if(!err){
        console.log(data.toString('utf8'));
    }else{
        console.log(err);
    }
});

message 是来自 websocket 的字符串

在 NodeJS 中出现此错误

{ Error: invalid code lengths set
    at Inflate.zlibOnError (zlib.js:152:15) errno: -3, code: 'Z_DATA_ERROR' }

为了找到问题,我尝试使用base64,它工作正常。

zlib.inflate(new Buffer(message, "base64"), function(err, data){
    if(!err){
        console.log(data.toString('utf8'));
    }else{
        console.log(err);
    }
});

我还尝试在 Java 和 Javascript 中对字符串进行充气\放气。尝试从 Java 的 utf-8 字符串在 javascript 中创建缓冲区时发生了一些奇怪的事情。 UTF-8 字符串是相同的,但缓冲区有点不同。顺便说一句,缓冲区的请求是一样的。

更新: 答:使用 Base64 而不是 UTF-8

【问题讨论】:

    标签: javascript java node.js deflate inflate


    【解决方案1】:

    使用 UTF-8 字符串编码表示二进制数据不是一个好主意,请参阅Encoding to use to convert Bytes array to String and vice-versa 以了解类似问题。只需对数据进行 base64 编码(请参阅https://docs.oracle.com/javase/8/docs/api/java/util/Base64.html)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      • 2016-07-18
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多