java - 通过 BLE 将 GZIP 数据从 Android 发送到 NodeJS

标签 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' }

我做错了什么,我该如何解决这个问题?

最佳答案

通过将这 4 个字节( block 复制)添加到压缩字节数组,您可以有效地修改压缩数据的 header (错误说明)。 像下面那样删除它们:

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 个字节(这是 block 复制)。

关于java - 通过 BLE 将 GZIP 数据从 Android 发送到 NodeJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52686481/

相关文章:

android - 尽管存在资源,但Android资源链接失败

javascript - Webpack - scss/css 模块样式未在产品中应用

node.js - 在nodeJs中使用res.send()发送响应

java - frame.repaint() 不工作

java - 从 AHK 到 Java 的变量

java - Maven 依赖插件 - 解包 jar 文件时排除目录

java - 当用户在我的 Spring Web 应用程序上更新他们的个人资料图片并更新他们的个人资料时,属于该用户的列表中的对象将被复制

java - 未找到 Android 服务(接触变化检测)

javascript - 使用 node.js 从 json 数据中过滤值

Android Studio 收到支持警告 :appcompat-v7:28. 0.0