通过tcp将4字节浮点值从Dart发送到C++; 我有一个麻烦,通过TCP Socket从DART客户端向C++服务器发送4字节的双值。
下面是颤振(Dart)代码通过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
类数据包扩展对象{
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