在Dart中连接字节

8

假设我有一个字节大小的整数列表。前四个字节(列表中的前四个项目)实际上是单精度浮点数的组成部分。我想要将这4个字节连接起来,然后转换为浮点数。我该如何做?

File myFile = new File('binaryfile.bin')
List<int> fileBytes = myFile.readAsBytes()
double myFloat = generateFloat(fileBytes.getRange(0, 4)); // how do I make this?
1个回答

12

使用类型化数据数组

引用ByteData的描述:

一个固定长度的随机访问字节序列,还提供了对由这些字节表示的定宽整数和浮点数进行随机和非对齐访问的支持。 ByteData可用于从外部源(如网络或文件系统)打包和解包数据。

继续你的示例

import 'dart:io'
import 'dart:typed_data';

...

File myFile = new File('binaryfile.bin')
List<int> fileBytes = myFile.readAsBytesSync();

// Turn list of ints into a byte buffer
ByteBuffer buffer = new Int8List.fromList(fileBytes).buffer;

// Wrap a ByteData object around buffer
ByteData byteData = new ByteData.view(buffer);

// Read first 4 bytes of buffer as a floating point
double x = byteData.getFloat32(0);

然而,请注意你的数据的字节序

其他人可能会指出更好的将数据从文件读入ByteBuffer中的方法。


我猜应该用Uint8List而不是Int8List?另外一个优化方法——readAsBytes()其实已经返回了Uint8List。所以你可以避免复制操作——例如:ByteBuffer buffer = fileBytes is Uint8List ? fileBytes.buffer : new Uint8List(fileBytes).buffer; - Greg Lowe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接