簡體   English   中英

用Java壓縮,用Javascript壓縮,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);
}

然后用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中對字符串進行膨脹/縮小。 嘗試從Java的utf-8字符串在javascript中創建緩沖區時發生了奇怪的事情。 UTF-8字符串相同,但緩沖略有不同。 緩沖區的乞求方式是一樣的。

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

使用UTF-8字符串編碼表示二進制數據不是一個好主意,有關類似問題,請參見用於將Bytes數組轉換為String或反之的Encoding 只是對數據進行base64編碼(請參閱https://docs.oracle.com/javase/8/docs/api/java/util/Base64.html )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM