encoding - 如何将 Dart 的ByteData转换为字符串?

220 阅读2分钟

encoding - 如何将 Dart 的ByteData转换为字符串?

我正在读取一个二进制文件,并希望将其转换为字符串。如何在Dart中完成?

最佳答案

尝试以下

String getStringFromBytes(ByteData data) {

  final buffer = data.buffer;

  var list = buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);

  return utf8.decode(list);

}

ByteData 是一个抽象:

一个固定长度的随机访问字节序列,它还提供对这些字节表示的固定宽度整数和浮点数的随机和未对齐访问。

正如 Gunter 在评论中提到的,您可以使用File.writeAsBytes. 但是,它确实需要一些 API 工作才能从ByteDataList<int>

import 'dart:async';

import 'dart:io';

import 'dart:typed\_data';



Future<void> writeToFile(ByteData data, String path) {

  final buffer = data.buffer;

  return new File(path).writeAsBytes(

      buffer.asUint8List(data.offsetInBytes, data.lengthInBytes));

你需要安装path_provider包,然后

这应该工作:

import 'dart:async';

import 'dart:io';

import 'dart:typed\_data';

import 'package:path\_provider/path\_provider.dart';



final dbBytes = await rootBundle.load('assets/file'); // <= your ByteData



//=======================

Future<File> writeToFile(ByteData data) async {

    final buffer = data.buffer;

    Directory tempDir = await getTemporaryDirectory();

    String tempPath = tempDir.path;

    var filePath = tempPath + '/file\_01.tmp'; // file\_01.tmp is dump file, can be anything

    return new File(filePath).writeAsBytes(

        buffer.asUint8List(data.offsetInBytes, data.lengthInBytes));

}

//======================

获取您的文件:

var file;

try {

    file = await writeToFile(dbBytes); // <= returns File

} catch(e) {

    // catch errors here

}

如何转换ByteDataList<int>

经过自我调查,解决方案是:

  1. .cast<int>()
ByteData audioByteData = await rootBundle.load(audioAssetsFullPath);

Uint8List audioUint8List = audioByteData.buffer.asUint8List(audioByteData.offsetInBytes, audioByteData.lengthInBytes);

List<int> audioListInt = audioUint8List.cast<int>();

或 2. 使用 .map

ByteData audioByteData = await rootBundle.load(audioAssetsFullPath);

Uint8List audioUint8List = audioByteData.buffer.asUint8List(audioByteData.offsetInBytes, audioByteData.lengthInBytes);

List<int> audioListInt = audioUint8List.map((eachUint8) => eachUint8.toInt()).toList();

最后

这里也为想要学习Flutter的朋友们准备了两份学习手册《Flutter Dart语言编程入门到精通》《Flutter实战》

关注Vx公众号 :Android老皮

《Flutter Dart 语言编程入门到精通》

  • 第一章 Dart语言基础

  • 第二章 Dart 异步编程
    在这里插入图片描述

  • 第三章 异步之 Stream 详解

  • 第四章 Dart标准输入输出流
    在这里插入图片描述

  • 第五章 Dart 网络编程

  • 第六章 Flutter 爬虫与服务端
    在这里插入图片描述

  • 第七章 Dart 的服务端开发

  • 第八章 Dart 调用C语言混合编程

  • 第九章 LuaDardo中Dart与Lua的相互调用
    在这里插入图片描述

《Flutter实战:第二版》

  • 第一章:起步
  • 第二章:第一个Flutter应用
  • 第三章:基础组件
  • 第四章:布局类组件
  • 第五章:容器类组件

在这里插入图片描述

  • 第六章:可滚动组件

  • 第七章:功能型组件

  • 第八章:事件处理与通知

  • 第九章:动画

  • 第十章:自定义组件
    在这里插入图片描述

  • 第十一章:文件操作与网络请求

  • 第十二章:Flutter扩展

  • 第十三章:国际化

  • 第十四章:Flutter核心原理

  • 第十五章:一个完整的Flutter应用
    在这里插入图片描述

关注Vx公众号 :Android老皮