Flutter二进制编码解码插件binary_codec的使用

发布于 1周前 作者 songsunli 来自 Flutter

Flutter二进制编码解码插件binary_codec的使用

binary_codec 是一个用于将标准数据类型转换为二进制格式并再次转换回来的Dart库。支持的数据类型包括:Null、bool、double、int、Uint8List、String、Map和List,其中Map和List可以包含任何支持的数据类型作为键和值。

在dart2js中,整数始终被编码为双精度浮点数。如果你尝试在dart2js中解码超出安全范围的整数,你可能无法得到确切的值。但是,只要你保持在一个平台上(不切换平台),你就是安全的,不需要担心这个问题。

示例代码

下面是一个完整的示例demo,演示了如何使用 binary_codec 插件进行二进制编码和解码。

import 'dart:math';
import 'dart:typed_data';

import 'package:binary_codec/binary_codec.dart'; // 假设binary_codec已经添加到pubspec.yaml中

/// Example text
const loremIpsum = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, '
    'sed diam nonumy eirmod tempor invidunt ut labore et dolore '
    'magna aliquyam erat, sed diam voluptua. At vero eos et accusam '
    'et justo duo dolores et ea rebum. Stet clita kasd gubergren, no '
    'sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem '
    'ipsum dolor sit amet, consetetur sadipscing elitr, sed diam '
    'nonumy eirmod tempor invidunt ut labore et dolore magna '
    'aliquyam erat, sed diam voluptua. At vero eos et accusam '
    'et justo duo dolores et ea rebum. Stet clita kasd gubergren, '
    'no sea takimata sanctus est Lorem ipsum dolor sit amet.';

void main() {
  var exampleObject = generateSomeData();

  /// Encode the generated data
  Uint8List encoded = binaryCodec.encode(exampleObject);

  /// Decode the encoded data
  var decoded = binaryCodec.decode(encoded);

  /// Check if they are the same
  if (exampleObject.toString() == decoded.toString()) {
    /// They should be the same
    print('Success');
  } else {
    /// Else there's a bug in the library
    /// Please send the [exampleObject] that leads here and on which platform
    /// you are to the author of this library (stefan.zemljic@protonmail.com)
    print('Wait... What???');
  }
}

dynamic generateSomeData() {
  var random = Random();
  var shortBinaryLists = List.generate(16, (length) {
    return Uint8List.fromList(
      List.generate(length, (_) => random.nextInt(256)),
    );
  });
  var someDoubles = [
    2930543.324960,
    -134943.2345,
    0.0,
    1.0,
    -1.0,
    double.infinity,
    double.nan,
    double.maxFinite,
    double.negativeInfinity,
    double.minPositive,
  ];
  var someInts = [321, 43956, -23459, 0, 1, -1, -239458];
  return {
    'small positive ints': List.generate(128, (x) => x),
    'small negative ints': List.generate(64, (x) => -x),
    'short binary lists': shortBinaryLists,
    'short texts': ['hello world', 'lorem ipsum', 'asdf qwer jklö'],
    'ints': someInts,
    'null': null,
    'booleans': [true, false],
    'doubles': someDoubles,
    'bigger binary lists':
        Uint8List.fromList(List.generate(1266, (x) => x % 256)),
    'bigger texts': loremIpsum.substring(0, 430),
    'lists': ['1', 2, 3.0, List.generate(4, (_) => 4), 'Five'],
    'maps': {'key1': 'value1', true: false, false: true, 4.0: 4, 5: 5.0},
  };
}

使用步骤

  1. 添加依赖:首先,在你的pubspec.yaml文件中添加binary_codec依赖:

    dependencies:
      binary_codec: ^latest_version # 请替换为最新版本号
    
  2. 导入库:在你的Dart文件中导入binary_codec库:

    import 'package:binary_codec/binary_codec.dart';
    
  3. 生成测试数据:使用generateSomeData函数生成一些测试数据。该函数返回一个包含各种数据类型的Map。

  4. 编码数据:使用binaryCodec.encode方法将数据编码为Uint8List

  5. 解码数据:使用binaryCodec.decode方法将Uint8List解码回原始数据结构。

  6. 验证结果:比较原始数据和解码后的数据是否相同,以验证编码解码过程是否正确。

通过这个完整的示例,你可以轻松地理解和使用binary_codec插件进行二进制编码和解码操作。如果有任何问题或发现bug,请参考注释中的提示联系作者。


更多关于Flutter二进制编码解码插件binary_codec的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter二进制编码解码插件binary_codec的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,我可以为你提供一个关于如何在Flutter中使用binary_codec插件进行二进制编码和解码的示例。binary_codec是一个用于在Flutter应用中处理二进制数据的插件,尽管Flutter官方并没有直接提供一个名为binary_codec的插件,但通常处理二进制数据可以使用Dart的内置功能。这里,我将展示如何使用Dart的内置功能来实现二进制数据的编码和解码。

首先,确保你的pubspec.yaml文件中没有特定的依赖项需要添加,因为我们将使用Dart的内置库。

示例代码

下面是一个简单的Flutter应用示例,它演示了如何使用Dart的dart:typed_data库来处理二进制数据。

import 'package:flutter/material.dart';
import 'dart:typed_data';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Binary Codec Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: BinaryCodecExample(),
    );
  }
}

class BinaryCodecExample extends StatefulWidget {
  @override
  _BinaryCodecExampleState createState() => _BinaryCodecExampleState();
}

class _BinaryCodecExampleState extends State<BinaryCodecExample> {
  String encodedString = '';
  String decodedString = '';

  void encodeData() {
    // 原始字符串数据
    String originalString = "Hello, Binary Codec!";
    // 将字符串转换为Uint8List(二进制数据)
    Uint8List encodedData = Uint8List.fromList(originalString.codeUnits);
    // 将Uint8List转换为Base64字符串以便于显示
    encodedString = base64Encode(encodedData);
    setState(() {});
  }

  void decodeData() {
    // 确保有数据可以解码
    if (encodedString.isEmpty) return;
    // 将Base64字符串解码为Uint8List
    Uint8List encodedData = base64Decode(encodedString);
    // 将Uint8List转换回字符串
    String decodedText = String.fromCharCodes(encodedData);
    decodedString = decodedText;
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Binary Codec Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Encoded Data (Base64):'),
            TextField(
              readOnly: true,
              maxLines: 5,
              controller: TextEditingController(text: encodedString),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: encodeData,
              child: Text('Encode String to Binary'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: decodeData,
              child: Text('Decode Binary to String'),
            ),
            SizedBox(height: 20),
            Text('Decoded Data:'),
            Text(decodedString),
          ],
        ),
      ),
    );
  }
}

解释

  1. 编码部分

    • originalString 是我们要编码的原始字符串。
    • 使用 originalString.codeUnits 将字符串转换为UTF-8编码的整数列表。
    • 使用 Uint8List.fromList(...) 将整数列表转换为 Uint8List,这是Dart中表示二进制数据的类型。
    • 使用 base64Encode(encodedData)Uint8List 转换为Base64编码的字符串,以便于显示和传输。
  2. 解码部分

    • 使用 base64Decode(encodedString) 将Base64编码的字符串解码回 Uint8List
    • 使用 String.fromCharCodes(encodedData)Uint8List 转换回原始字符串。
  3. UI部分

    • 使用 TextField 显示编码后的Base64字符串。
    • 使用 ElevatedButton 触发编码和解码操作。
    • 使用 Text 显示解码后的字符串。

这个示例展示了如何在Flutter应用中处理二进制数据的编码和解码。虽然我们没有直接使用一个名为binary_codec的插件,但Dart的内置功能已经足够强大,可以满足大多数二进制数据处理需求。

回到顶部