javascript - Java 中的 Deflate、Javascript 中的 Inflate、Z_DATA_ERROR

标签 javascript java node.js deflate inflate

我需要在 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);
    }
});

消息是来自 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 中对字符串进行 inflate\deflate 。尝试从 Java 的 utf-8 字符串在 javascript 中创建缓冲区时,发生了一些奇怪的事情。 UTF-8 字符串相同,但缓冲区略有不同。顺便说一句,缓冲区的请求是相同的。

更新: 答案:使用Base64代替UTF-8

最佳答案

使用 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 )。

关于javascript - Java 中的 Deflate、Javascript 中的 Inflate、Z_DATA_ERROR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44561145/

相关文章:

javascript - Javascript 正则表达式中的问号(奇怪的行为)

Java构造函数继承

java - LinearLayout内部RelativeLayout使用 super 父级作为父级

javascript - 通过 POST 接收 JSON 的 API 接收到的类型与发送的类型不同

javascript - 对对象类型数组的属性求和并将它们连接为单个对象

javascript - 如何使用 jquery 从 json 数组中分离值。?

javascript - 从 IndexedDB 检索类型化对象

javascript - 在将元素添加到 DOM 之前,我可以在元素上调用 jQuery Colorbox 吗?

Java VM 无法使用 `android.util.*` : Mutable classes cannot be initialized with value other than zero

javascript - 如何在谷歌地理编码调用中传递一些参数