Отправка данных GZIP с Android на NodeJS через BLE - PullRequest
0 голосов
/ 07 октября 2018

Я собрал строку на устройстве 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' }

Что я делаю не так, и как я могу исправить это?

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

добавляя эти 4 байта (blockcopy) к сжатому байтовому массиву, вы эффективно модифицируете заголовок сжатых данных (о чем говорит ошибка).либо удалите их, как показано ниже:

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);
}

, либо опустите первые 4 байта (что является блок-копией) var buf, прежде чем передавать их в zlib.gunzipSync ().

0 голосов
/ 07 октября 2018

Попробуйте использовать кодек Apache Commons Base64OutputStream, это выведет поток уже в Base64.Проверьте: Как я могу преобразовать строку в строку GZIP Base64?

...