【问题标题】:flutter/dart: How to decompress/inflate zlib binary string in flutter颤振/飞镖:如何在颤振中解压缩/膨胀zlib二进制字符串
【发布时间】:2020-02-13 06:50:44
【问题描述】:

我在我的 nodejs 服务器上使用 pako 包,并将压缩的二进制字符串从服务器发送到我的颤振客户端。我无法在颤振客户端上解压缩/膨胀它。我尝试了库的组合

我的服务器 NodeJS 代码:

    var pako = require('pako');
    let buffer = pako.deflate(JSON.stringify(userModels), { to: 'string' });
    //Server code for sending to client

我的颤振代码:

import 'dart:io';
import 'dart:convert';
List<int> gzipBytes = serverResponse.data.codeUnits;
List<int> stringBytes = gzip.decode(gzipBytes);
var data = utf8.decode(stringBytes);

我收到以下异常..

在 1,725 毫秒内重新启动应用程序。 E/颤振(25340): [错误:flutter/lib/ui/ui_dart_state.cc(148)] 未处理的异常: InternalError: '过滤器错误,错误数据' E/flutter (25340): #0
_FilterImpl.processed (dart:io-patch/filter_patch.dart:11:32) E/flutter (25340): #1 _FilterSink.addSlice (dart:io/data_transformer.dart:610:29) E/flutter (25340): #2
_FilterSink.add (dart:io/data_transformer.dart:596:5) E/flutter (25340): #3 ZLibDecoder.convert (dart:io/data_transformer.dart:465:9) E/flutter (25340): #4
Codec.decode (dart:convert/codec.dart:26:34)

【问题讨论】:

  • 您能否打印正在传输的内容的十六进制(在服务器和客户端上),以确保您收到服务器发送的内容。您是否正确设置了Content-Type(例如application/octet-stream)?还要检查Content-Encoding是否可以帮助你,那么你根本不需要压缩。

标签: flutter dart binary zlib pako


【解决方案1】:

你没有展示你是如何接收数据的,但不要通过字符串。例如,如果使用package:http,则使用:

var bytes = response.bodyBytes;

接下来,您似乎不应该使用gzip,而应该使用zlib;

var inflated = zlib.decode(bytes);
var data = utf8.decode(inflated);
json.decode(data);

【讨论】:

  • 我将来自服务器的响应作为 Json 对象发送。因此,我必须将压缩的 zlib 数据转换为二进制字符串,以使其成为 json 对象的一部分。根据您的建议,我将服务器更改为发送压缩整数而不是字符串,现在它可以工作了。谢谢
猜你喜欢
  • 2020-05-19
  • 2020-09-12
  • 1970-01-01
  • 2023-03-05
  • 2020-11-05
  • 2020-08-12
  • 2021-01-06
  • 2021-03-06
  • 2020-12-25
相关资源
最近更新 更多