前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >encoding - 如何将 Dart 的ByteData转换为字符串?

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

原创
作者头像
徐建国
修改2021-08-31 10:45:06
3.5K0
修改2021-08-31 10:45:06
举报
文章被收录于专栏:个人路线

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

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

**最佳答案**

尝试以下

代码语言:txt
复制
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>

代码语言:txt
复制
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包,然后

这应该工作:

代码语言:txt
复制
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));

}

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

获取您的文件:

代码语言:txt
复制
var file;

try {

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

} catch(e) {

    // catch errors here

}

如何转换ByteDataList<int>

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

  1. .cast<int>()
代码语言:txt
复制
ByteData audioByteData = await rootBundle.load(audioAssetsFullPath);

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

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

或 2. 使用 .map

代码语言:txt
复制
ByteData audioByteData = await rootBundle.load(audioAssetsFullPath);

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

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • encoding - 如何将 Dart 的ByteData转换为字符串?
    • **最佳答案**
      • 这应该工作:
        • 如何转换ByteData为List<int>?
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档