gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:52:34 29 4
gpt4 key购买 nike

我需要在 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com