Отправить 4-байтовое значение с плавающей запятой через tcp из Dart в C ++ - PullRequest
0 голосов
/ 19 марта 2020

У меня проблема с отправкой 4-байтового двойного значения через tcp-сокет с клиента Dart на сервер c ++.

Ниже приведен код флаттера (Dart).

class DataPacket extends object{
  String message = "some";
  int ID = 1;
  double x = 1.38;

  @override
  String toString() {
    String value = message;
    value += getCharCodeStringFromInt(ID);
    value += getCharCodeStringFromDouble(x);
    return value;
  }

  Uint8List _getInt16LittleEndianBytes(int value) =>
    Uint8List(2)..buffer.asByteData().setInt16(0, value, Endian.little);

  String getCharCodeStringFromInt(int value){
     Uint8List message_id_list = _getInt16LittleEndianBytes(value);
     return getCharCodeStringFromUint8List(message_id_list);
  }

  String getCharCodeStringFromDouble(double value) {
//    List<double> temp = List<double>() ;
//    temp.add(value);
//    Float32List floatlist = Float32List.fromList(temp);
//    Uint8List list = Uint8List.view(floatlist.buffer);

//    Uint8List list = binaryCodec.encode(value);

      Uint8List list = Uint8List(4)..buffer.asByteData().setFloat32(0, value);

      print("Uint8List from double : ${list}");
      print("Uint8List length from double : ${list.length}");
      print("CharCodeString from double Length : 
      ${getCharCodeStringFromUint8List(list).length}");
      return getCharCodeStringFromUint8List(list);
  }

  String getCharCodeStringFromUint8List(Uint8List list){
    String charCodeString = "";
    list.forEach((charCode) => charCodeString += String.fromCharCode(charCode));
    return charCodeString;
  }

}


//Some Class   
void sendMessage(){
  print(DataPacket().toString().length);
  List<int> data = _socket.encoding.encode(DataPacket().toString());
                   //utf8.encode(DataPacket().toString());
  print(data.length);
  _socket.add(data);
}

Я могу разобрать строку и int в c ++ memcpy. но не может удвоить значение.

Когда я проверял содержимое байтовых данных и длины, получаемый из double Uint8List удлинился в методе кодирования сокета.

Я имею в виду длину Uint8List из двойного было 4, прежде чем закодировано. Однако длина возвращаемого значения (List) становится 7 после кодирования. поэтому результаты печати DataPacket().toString().length и data.length отличаются друг от друга.

Я не могу разобрать 7 байт с плавающей точкой в ​​c ++ ..

Комментированные строки - это способы, которые я пробовал.

Есть ли способ?

Спасибо.

1 Ответ

0 голосов
/ 19 марта 2020

Проблема не в том, как вы кодируете число с плавающей точкой в ​​байтах, а в том, что вы делаете с ним в следующий раз, пытаясь преобразовать его в строку.

Если вы хотите отправить 4 байта через сокет ( предполагая, что вы имеете в виду dart:io Socket), просто используйте метод add.

  Socket s;
  var floatValue = 1.38;
  var bytes = Uint8List(4)
    ..buffer.asByteData().setFloat32(0, floatValue, Endian.little);
  print(bytes); // prints [215, 163, 176, 63]
  s.add(bytes);

В этом примере вы начали с целевого байтового массива, а затем использовали его asByteData установить одно значение. Это хороший способ создать структуру смешанных типов - int, float и т. Д. c. Если вам просто нужно преобразовать массив чисел с плавающей точкой в ​​байты, вы можете сделать это немного проще:

  var bytes = Float32List.fromList([floatValue]).buffer.asUint8List();

Я не уверен, что вам действительно нужно что-то делать со строками. Это то, что вы действительно хотите:

  Socket s;
  var message = 'some';
  var id = 1;
  var x = 1.38;

  s.add(ascii.encode(message)); // choose the appropriate codec: ascii, utf8
  s.add(Int16List.fromList([id]).buffer.asUint8List());
  s.add(Float32List.fromList([x]).buffer.asUint8List());
  // rather than adding each in turn, you could also form a longer byte array
  // of the 3 elements and add that
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...