Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过tcp将4字节浮点值从Dart发送到C++; 我有一个麻烦,通过TCP Socket从DART客户端向C++服务器发送4字节的双值。_C++_Flutter_Dart_Tcp - Fatal编程技术网

通过tcp将4字节浮点值从Dart发送到C++; 我有一个麻烦,通过TCP Socket从DART客户端向C++服务器发送4字节的双值。

通过tcp将4字节浮点值从Dart发送到C++; 我有一个麻烦,通过TCP Socket从DART客户端向C++服务器发送4字节的双值。,c++,flutter,dart,tcp,C++,Flutter,Dart,Tcp,下面是颤振(Dart)代码 类数据包扩展对象{ String message=“some”; int-ID=1; 双x=1.38; @凌驾 字符串toString(){ 字符串值=消息; 值+=getCharCodeStringFromInt(ID); 值+=getCharCodeStringFromDouble(x); 返回值; } UINT8列表\u getInt16LittleEndianBytes(int值)=> Uint8List(2)…buffer.asByteData().setI

下面是颤振(Dart)代码

类数据包扩展对象{
String message=“some”;
int-ID=1;
双x=1.38;
@凌驾
字符串toString(){
字符串值=消息;
值+=getCharCodeStringFromInt(ID);
值+=getCharCodeStringFromDouble(x);
返回值;
}
UINT8列表\u getInt16LittleEndianBytes(int值)=>
Uint8List(2)…buffer.asByteData().setInt16(0,value,Endian.little);
字符串getCharCodeStringFromInt(int值){
UINT8列表消息\u id\u列表=\u getInt16LittleEndianBytes(值);
返回getCharCodeStringFromUint8List(消息\u id\u列表);
}
字符串getCharCodeStringFromDouble(双值){
//List temp=List();
//临时增加值;
//Float32List floatlist=Float32List.fromList(temp);
//Uint8List=Uint8List.view(floatlist.buffer);
//Uint8List list=binaryCodec.encode(值);
Uint8List list=Uint8List(4)…buffer.asByteData().setFloat32(0,值);
打印(“Uint8List from double:${list}”);
打印(“Uint8List-length from-double:${list.length}”);
打印两倍长度的字符码字符串:
${getCharCodeStringFromUint8List(list.length}”);
返回getCharCodeStringFromUint8List(列表);
}
字符串getCharCodeStringFromUint8List(Uint8List列表){
字符串charCodeString=“”;
list.forEach((charCode)=>charCodeString+=String.fromCharCode(charCode));
返回charCodeString;
}
}
//某类
void sendMessage(){
打印(数据包().toString().length);
列表数据=_socket.encoding.encode(DataPacket().toString());
//utf8.encode(DataPacket().toString());
打印(数据长度);
_socket.add(数据);
}
<>我可以通过C++ >代码> MyCPY解析C++中的字符串和int。 但不能将价值加倍

当我检查字节数据和长度的内容时, 在套接字的编码方法中,从double中获取的UINT8列表已加长

我的意思是,在编码之前,double的Uint8List的长度是4。 然而,编码后返回值(列表)的长度变为7。 所以打印
DataPacket().toString().length
data.length
的结果是不同的

<>我无法解析C++中的7个字节的浮点…./p> 注释行是我尝试的方式

有办法吗


谢谢。

问题不在于如何将浮点编码为字节,而在于下一步如何将其转换为字符串

如果要通过套接字发送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);
在本例中,您从目标字节数组开始,然后使用它来设置一个值。这是一种构建混合类型结构(int、float等)的好方法。如果您只需要将一个float数组转换为字节,您可以使用以下更简单的方法:

  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

你的第一个问题是一个
double
是8字节,不是4字节。你是对的,但我把它转换成了float32。dart中有浮点数类型还是4字节浮点数类型?所以你的问题不是关于
double
,而是关于
float
。所以把它修好,让它这么说。我也这么认为,谢谢!谢谢你的好意!我试图获取字符串消息,因为我必须将这些数据作为一个数据包发送。我没有考虑过按原样发送UInt8列表。我把C++的UINT8列表和解析方法结合起来,C++服务器仍然是工作的,甚至是浮点的。非常感谢。顺便问一下,从float32转换而来的Uint8List中的编码字符串改变其长度的原因是什么?4个字节中的3个字节占用了2个utf8字节,因此为7。正如您所发现的,获取任意字节的字符码通常是没有意义的。它成功了,我解决了我的问题!对不起,我迟到了。非常感谢。
  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