我在 Android 設備上構建了一個字符串,我需要壓縮它并通過低功耗藍牙將其發送到需要解壓縮的 NodeJS 應用程序。在 Android/Java 端,我使用 GZIP 壓縮它,然后在發送之前對其進行 Base64 編碼,如下所示:public static String compress(String str) throws IOException { byte[] blockcopy = ByteBuffer .allocate(4) .order(java.nio.ByteOrder.LITTLE_ENDIAN) .putInt(str.length()) .array(); ByteArrayOutputStream os = new ByteArrayOutputStream(str.length()); GZIPOutputStream gos = new GZIPOutputStream(os); gos.write(str.getBytes()); gos.close(); os.close(); byte[] compressed = new byte[4 + os.toByteArray().length]; System.arraycopy(blockcopy, 0, compressed, 0, 4); System.arraycopy(os.toByteArray(), 0, compressed, 4, os.toByteArray().length); return Base64.encodeToString(compressed, Base64.DEFAULT);}在 NodeJS 端,我收到它,解碼 Base64,然后嘗試使用zlib庫如下解壓縮它:var buf = Buffer.from(raw, 'base64');var data = zlib.gunzipSync(buf);我已經單獨測試了藍牙通信,并且可以完全正常收集常規的解壓縮數據。我還測試了發送未壓縮但以 Base64 編碼的原始數據,并且解碼和工作正常。但是,在嘗試解壓縮時,我從zlib庫中收到以下錯誤:{ Error: incorrect header check at Gunzip.zlibOnError (zlib.js:153:15) at Gunzip._processChunk (zlib.js:411:30) at zlibBufferSync (zlib.js:144:38) at Object.gunzipSync (zlib.js:590:14) ... errno: -3, code: 'Z_DATA_ERROR' }我做錯了什么,我該如何解決這個問題?
2 回答

慕碼人8056858
TA貢獻1803條經驗 獲得超6個贊
通過將這 4 個字節(塊復制)添加到壓縮字節數組中,您可以有效地修改壓縮數據的標頭(錯誤說明)。要么像下面那樣刪除它們:
public static String compress(String str) throws IOException {
ByteArrayOutputStream os = new ByteArrayOutputStream(str.length());
GZIPOutputStream gos = new GZIPOutputStream(os);
gos.write(str.getBytes());
gos.finish();
gos.close();
os.close();
return Base64.encodeToString(os.toByteArray(), Base64.DEFAULT);
}
或者在將 var buf 傳遞給 zlib.gunzipSync() 之前省略前 4 個字節(即塊復制)。
添加回答
舉報
0/150
提交
取消