在 Java 中收缩,在 Java 脚本中膨胀,Z_DATA_ERROR
Deflate in Java, Inflate in Javascript, Z_DATA_ERROR
我需要缩小 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);
}
并且这段代码在Java脚本
中解压
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 和 Java 脚本中 inflate\deflate 字符串。尝试从 Java 的 utf-8 字符串在 java 脚本中创建缓冲区时发生了一些奇怪的事情。 UTF-8 字符串相同,但缓冲区略有不同。顺便说一句,缓冲区的请求是一样的。
更新:
答案:使用 Base64 而不是 UTF-8
使用 UTF-8 字符串编码表示二进制数据不是一个好主意,请参阅 Encoding to use to convert Bytes array to String and vice-versa for a similar problem. Just base64 encode the data instead (see https://docs.oracle.com/javase/8/docs/api/java/util/Base64.html)。
我需要缩小 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);
}
并且这段代码在Java脚本
中解压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 和 Java 脚本中 inflate\deflate 字符串。尝试从 Java 的 utf-8 字符串在 java 脚本中创建缓冲区时发生了一些奇怪的事情。 UTF-8 字符串相同,但缓冲区略有不同。顺便说一句,缓冲区的请求是一样的。
更新: 答案:使用 Base64 而不是 UTF-8
使用 UTF-8 字符串编码表示二进制数据不是一个好主意,请参阅 Encoding to use to convert Bytes array to String and vice-versa for a similar problem. Just base64 encode the data instead (see https://docs.oracle.com/javase/8/docs/api/java/util/Base64.html)。