如何解决未处理的异常:FormatException:意外的扩展字节偏移量 5
Json 响应有一个 gzip 编码的字符串。
var dataList = [
{"Data": "compressedata"},{"Data": "compressedData"}
];
我尝试了很多方法来解压缩字符串,但都没有得到预期的结果。最后尝试的方法是
List<int> res = base64.decode(base64.normalize(zipText));
print(utf8.decode(res));
其中 zipText 是来自 json 的字符串,这会引发错误
Unhandled Exception: FormatException: Unexpected extension byte (at offset 5)
另一种方式
Uint8List compressed = base64.decode(zipText);
var gzipBytes = new GZipDecoder().decodeBytes(compressed);
print(gzipBytes);
抛出错误
Unhandled Exception: FormatException: Invalid GZip Signature Flutter
非常感谢任何帮助。
解决方法
根据抛出的错误,问题似乎来自您尝试解码的字符串。来自 json 响应的数据是否正确解析为 String?您可能需要考虑验证来自 json 响应的“compressedData”是否有效并且可以使用 gzip 进行解码。
如果 zipText
上的值确实访问了来自 dataList
的数据 - 这是一个 List
除此之外,您还需要将值从 GZipDecoder().decodeBytes(Uint8List)
解码为 String。
decode(String zipText) {
// if the sample data is a List<Map<String,String>>
// you need to use the key to access
// the compressed data from the List item
// zipText = '${_dataList[0]['Data']}';
Uint8List compressed = base64.decode(zipText);
var gzipBytes = new GZipDecoder().decodeBytes(compressed);
// Decode List<int> to String
var stringDecoded = utf8.decode(gzipBytes);
debugPrint('decoded: $stringDecoded');
setState(() {
_textEditingControllerEncode.text = stringDecoded;
});
}
这是一个您可以使用的简单沙盒。本示例中的 decode(String)
方法使用您提供的代码片段。
import 'dart:convert';
import 'dart:typed_data';
import 'package:archive/archive.dart';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',theme: ThemeData(
primarySwatch: Colors.blue,),home: MyHomePage(title: 'Flutter Demo Home Page'),);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key? key,required this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final _formEncodeKey = GlobalKey<FormState>();
final _formDecodeKey = GlobalKey<FormState>();
final _textEditingControllerEncode = TextEditingController();
final _textEditingControllerDecode = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),body: Center(
child: Column(
children: [
Expanded(
child: Form(
key: _formEncodeKey,child: Column(
children: <Widget>[
TextFormField(
controller: _textEditingControllerEncode,decoration: InputDecoration(
hintText: 'Enter some text to Encode'),validator: (value) {
if (value == null || value.isEmpty) {
return 'Please enter some text to Encode';
}
return null;
},ElevatedButton(
onPressed: () {
if (_formEncodeKey.currentState!.validate()) {
encode(_textEditingControllerEncode.value.text);
}
},child: Text('Encode'),],Expanded(
child: Form(
key: _formDecodeKey,child: Column(
children: <Widget>[
TextFormField(
controller: _textEditingControllerDecode,decoration: InputDecoration(
hintText: 'Enter some text to Decode'),validator: (value) {
if (value == null || value.isEmpty) {
return 'Please enter some text to Decode';
}
return null;
},ElevatedButton(
onPressed: () {
if (_formDecodeKey.currentState!.validate()) {
decode(_textEditingControllerDecode.value.text);
}
},child: Text('Decode'),);
}
var _dataList = [
{"Data": "H4sIABqe5GAA//NIzcnJVyjPL8pJUQQAlRmFGwwAAAA="},// Hello world!
{"Data": "H4sIABuk5GAA/3PLKS0pSS1SKMpPzi5WBADZNee+DgAAAA=="} // Flutter rocks!
];
encode(String zipText) {
var stringBytes = utf8.encode(zipText);
var gzipBytes = GZipEncoder().encode(stringBytes);
var stringEncoded = base64.encode(gzipBytes!);
debugPrint('encoded: $stringEncoded');
setState(() {
_textEditingControllerEncode.clear();
_textEditingControllerDecode.text = stringEncoded;
});
}
decode(String zipText) {
// if the sample data is a List<Map<String,String>>
// you need to use the key to access
// the compressed data from the List item
// zipText = '${_dataList[0]['Data']}';
Uint8List compressed = base64.decode(zipText);
var gzipBytes = new GZipDecoder().decodeBytes(compressed);
// Decode List<int> to String
var stringDecoded = utf8.decode(gzipBytes);
debugPrint('decoded: $stringDecoded');
setState(() {
_textEditingControllerEncode.text = stringDecoded;
_textEditingControllerDecode.clear();
});
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。