您的位置:首页 > 编程语言 > C语言/C++

解决C++与Java 使用Socket Float数据类型的正确互传

2017-04-26 11:08 1076 查看
本人在大三做一个不同小组Socket通信的大作业时,由于近日自学了一点Android,在其他小组均使用C++的情况下,决定使用Android写一个简单客户端程序。本想只要不同小组协议相同,实现起来应该没有特别大的难度,奈何自己编程能力着实有限,在互传数据时候遇到了十分棘手的问题。由于Java和C++在Float类型的数据处理方面有一定的不同,导致双方都无法正确收到float类型的数据。而网上大部分博客解决的都是java Float数据与字节数组的互转,少有C++方的解析方法,在继续查阅资料外加自己的一点想法,终于些许解决了互传float的问题,废话少说,先上结论:

1、Java与C++数据通信,如果不想用String类型,一定都要化成字节数组,C++方面使用char[] 代替即可

2、本次大作业里面C++是用Qt来写的,读取数据使用QDataStream,经试验表明,Java客户端不能使用封装好的sendFloat 或者 sendInt 等函数,否则读取方读取所需的字节数(如sendFloat发送后,C++读取4字节)后就停止继续读取了,虽然这里我也不知道为什么。但是当我把所有的数据都放入一个字节数组,一次发送后,Qt端便可以正确读取。

3、按照网上提供的将Java常见数据类型转化为字节数组的方法,包括Float的各种常见数据类型都可以正确转化,使用Java的 DataOutputStream流的send()函数,将整个字节数组一次发送。在Qt服务器端,Int型,Byte型,Short型都可以正确接收,唯独Float型,得到的都是0。感谢CSDN,尤其感谢博主 WOHAOHEN的文章: java
float/double转化byte[] 与C++端接收 解决方法如下:

声明一个union

union toFloat {
char bytePtr[4];
float floatValue;
};


在接收的时候声明一个字符数组暂存发来的float类型的4个字节

QDataStream os(tcp);
unsigned char temp[4];
os >> roomID >> temp[0] >> temp[1] >> temp[2] >> temp[3];


写一个接收Java Float类型的函数

float receiveFloat(unsigned char *bytes) {
toFloat toFloatValue;
int byteArrayLen = sizeof(toFloatValue.bytePtr);
memcpy(toFloatValue.bytePtr, bytes, byteArrayLen);
return toFloatValue.floatValue;
}

这样以来,所有从Java发来的Float类型的4个字节的数据,通过转化可以被C++正确读取

C++发送给Java float类型的数据时同理,只需把之前的过程完全反过来即可

QDataStream os(tcp);
toFloat sendFloat;
float floatToSend = 0.618;
sendFloat.floatValue = floatToSend;
unsigned char temp[4];
memcpy(temp, sendFloat.bytePtr, sizeof(sendFloat.bytePtr));
os << temp[0] << temp[1] << temp[2] << temp[3];


注意Java 客户端要读取Float类型时候,不能使用readFloat()函数,必须按字节逐个读取,并将读到的字节数组转为Java的Float类型,这个网上有很多教程与方法。

再次感谢博主的文章 java float/double转化byte[] 与C++端接收

本码农第一次写博客,语句或许晦涩难懂,所言之处或许漏洞百出,还望各位大牛批评指正,共同学习!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  socket android C++ float