通过BLE将Android的GZIP数据发送到NodeJS

时间:2018-10-07 07:49:25

标签: java android node.js base64 zlib

我已经在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 个答案:

答案 0 :(得分:1)

通过将这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);
}

或在将它们传递给zlib.gunzipSync()之前,忽略var buf的前4个字节(即块复制)。

答案 1 :(得分:0)

尝试使用Apache Commons Codec Base64OutputStream,这将输出Base64中已经存在的流。检查:How can I convert a string into a GZIP Base64 string?