Я собрал строку на устройстве Android, и мне нужно сжать ее и отправить через Bluetooth Low Energy в приложение 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);
Я проверил связь Bluetooth самостоятельно, и обычные, разархивированные данные собираются совершенно нормально.Я также проверил отправку необработанных данных в несжатом виде, но закодирован в 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' }
Что я делаю не так, и как я могу исправить это?