在Java中放气,在Javascript中充气,Z_DATA_ERROR

时间:2017-06-15 07:21:58

标签: 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);
    }
});

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来扩充\ deflate字符串。尝试使用Java中的utf-8字符串在javascript中创建缓冲区时发生了一些奇怪的事情。 UTF-8字符串相同但缓冲区略有不同。顺便说一句,缓冲区的切口是相同的。

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

1 个答案:

答案 0 :(得分:1)

It isn't a good idea to represent binary data using a UTF-8 string encoding, see 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).