Преобразуйте двойное значение в List в Dart

#flutter #dart #bluetooth #type-conversion

Вопрос:

Я использую flutter_blue для связи с устройством Bluetooth. Мне нужно передать двойное значение на устройство Bluetooth с помощью метода записи flutter_blue ().

Значение должно быть передано методу в виде списка целых чисел, который, насколько я понимаю, должен представлять список байтов.

Метод записи flutter_blue:

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

Существует ли способ преобразовать значение double в список целых чисел, который представляет значение double в виде списка байтов, чтобы передать его методу записи flutter_blues?

Например:

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

Комментарии:

1. Итак, вы хотите convertedValue , чтобы значение было a List только с преобразованным значением в качестве элемента ?

2. Передавая a double как «список целых чисел», вы имеете в виду список байтов ? Непонятно, о чем вы просите.

3. С помощью Bluetooth обычно передается информация в виде списка байтов(целых чисел). Это стандартная служба Bluetooth, в которую вы пытаетесь передать значения? Возможно, взгляните на Дополнение 4 к спецификации ГАТТ , особенно на раздел 2 «Ценности и представленные ценности», поскольку это может помочь ответить на некоторые из ваших вопросов

4. @jamesdlin Спасибо, что указали на это, я собираюсь отредактировать свой вопрос.

Ответ №1:

С помощью Bluetooth обычно передается информация в виде списка байтов(Uint8List). Решение для float ценности состоит в том, чтобы иметь ожидаемый показатель. Более подробная информация содержится в Дополнении 4 к Спецификации ГАТТ, особенно в разделе 2 «Значения и представленные значения».

Если число достаточно велико, его нужно будет преобразовать в байты в формате little endian. В качестве примера:

 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]