【问题标题】:Convert double value to List<Int> in Dart在 Dart 中将 double 值转换为 List<Int>
【发布时间】:2021-08-25 08:25:55
【问题描述】:

我正在使用 flutter_blue 与蓝牙设备进行通信。我需要使用flutter_blue write() method 将双精度值传递给蓝牙设备。

该值必须作为整数列表传递给方法,据我所知,它应该表示字节列表。

flutter_blue的写法:

Future<Null> write(
   List<int> value,
   {bool withoutResponse = false}
)

有没有办法将双精度值转换为整数列表,将双精度值表示为字节列表,以便将其传递给flutter_blues写入方法?

例如:

double value = 10.52;
List<Int> convertedValue = someConversionMethod(value);
await bluetoothCharacteristic.write(convertedValue);

【问题讨论】:

  • 所以你希望convertedValue 成为一个List,只将转换后的值作为元素?
  • 通过将double 作为“整数列表”传递,您是指字节列表吗?目前还不清楚您要的是什么。
  • 对于蓝牙,通常以字节(整数)列表的形式传递信息。它是您尝试将值传递给的标准蓝牙服务吗?也许看看GATT Specification Supplement 4,尤其是第 2 节“值和代表值”,因为这可能有助于回答您的一些问题
  • @jamesdlin 感谢您指出这一点,我将编辑我的问题。

标签: flutter dart bluetooth type-conversion


【解决方案1】:

对于蓝牙,通常以字节列表(Uint8List)的形式传递信息。 float 值的解决方案是有一个预期的指数。 GATT Specification Supplement 4 中有更多详细信息,尤其是在第 2 节“值和表示的值”中

如果数字足够大,则需要将其转换为小端格式的字节。举个例子:

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

void main() {
  double value = 10.52;
  var rawValue = value * pow(10, 2); // multiply value to remove decimal places
  print('Raw value to send: $rawValue'); // Raw value to send 1052
  var sendValue = ByteData(2);
  sendValue.setUint16(0, rawValue.toInt(), Endian.little);
  print('As Uint8List of values: ${sendValue.buffer.asUint8List()}');
  // As Uint8List of values: [28, 4]
}

【讨论】:

    【解决方案2】:

    dart:typed_data 库有一些有用的方法可以将数据转换为字节。这种方法对我有用。

    import 'dart:typed_data';
    
    List<int> doubleToListInt(double value) {
      ByteData bytes = ByteData(8);
      bytes.setFloat64(0, value);
    
      List<int> response =
      bytes.buffer.asInt8List().toList();
    
      return response;
    }
    
    print(doubleToListInt(10.52)); // Returns [64, 37, 10, 61, 112, -93, -41, 10]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-14
      • 1970-01-01
      • 2021-07-22
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多