java - 通过 BLE 将 GZIP 数据从 Android 发送到 NodeJS
问题描述
我在 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);
}
zlib
在 NodeJS 方面,我收到它,解码 Base64,然后尝试使用库按如下方式解压缩它:
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 个字节(块复制)添加到压缩字节数组中,您可以有效地修改压缩数据的标头(错误说明)。或者像下面这样删除它们:
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 的前 4 个字节(即块复制)传递给 zlib.gunzipSync() 之前省略它们。
推荐阅读
- c++ - C ++中的mfc问题
- r - 在编织 R 脚本而不用 R Markdown 编写它时,有没有办法增加 ggplots 的分辨率和宽度?
- c - 无法在 OpenGL 中更改背景颜色
- powershell - 如何在 Powershell 中将多个 .txt 文件保存为 .csv 文件而没有任何分隔符
- twig - 在包含的 Twig 模板末尾修剪空格(尾随换行符)
- matlab - 将矩形表面划分为相等的小矩形,中间有间隙
- python - 如何使用两个嵌套条件拆分列表
- git - git lfs 迁移后损坏的 git repo
- amazon-web-services - EKS 支持哪些 EC2 实例类型?
- liquibase - Hibernate Envers + Liquibase:列“REV”不允许为 NULL