如何在 Dart 中将字节数组转换为双精度值(浮点值)

How to convert a byte array to a double (float value) in Dart

基于this question,我在Dart中有一个字节列表:

final data = [123, 34, 106, 115, 111, 110, 114, 112, 99, 34, 58, 34, 50, 46, 48, 34, 44, 34, 109, 101, 116, 104, 111, 100, 34, 58, 34, 115];

它表示来自 TensorFlow Lite 的 Float32 值。如何将其转换为可读的 double 值?

您的数据包含 28 个字节,并且由于它表示 32 位浮点值(每个浮点值是 4 个字节),因此相当于七个 32 位值。

final data = [
  123, 34,  106, 115,   // 1
  111, 110, 114, 112,   // 2
  99,  34,  58,  34,    // 3
  50,  46,  48,  34,    // 4
  44,  34,  109, 101,   // 5
  116, 104, 111, 100,   // 6
  34,  58,  34,  115,   // 7
];

ByteData class from the dart:typed_data 库为您提供了对字节数据的不同看法。你想要的是 Float32 视图,它会给你一个 double in Dart.

final bytes = Uint8List.fromList(data);
final byteData = ByteData.sublistView(bytes);
double value = byteData.getFloat32(0);
print(value); // 8.433111377393183e+35

getFloat32(0)中的0表示要获取字节数组中索引0开始的32位浮点值。不过,这只会给你七个中的第一个值,所以如果你想要其余的,你需要遍历整个字节列表:

for (var i = 0; i < data.length; i += 4) {
  print(byteData.getFloat32(i));
}

在每个循环中,您将索引增加 4 以获得下一个 32 位浮点值的开头。 运行 该循环,您将看到所有七个值的结果:

8.433111377393183e+35
7.3795778785962275e+28
2.9925614505443553e+21
1.0139077133430874e-8
2.308231080230816e-12
7.366162972792583e+31
2.522593777484324e-18

另见