解决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
在接收的时候声明一个字符数组暂存发来的float类型的4个字节
写一个接收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类型的数据时同理,只需把之前的过程完全反过来即可
注意Java 客户端要读取Float类型时候,不能使用readFloat()函数,必须按字节逐个读取,并将读到的字节数组转为Java的Float类型,这个网上有很多教程与方法。
再次感谢博主的文章 java float/double转化byte[] 与C++端接收
本码农第一次写博客,语句或许晦涩难懂,所言之处或许漏洞百出,还望各位大牛批评指正,共同学习!
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++端接收
本码农第一次写博客,语句或许晦涩难懂,所言之处或许漏洞百出,还望各位大牛批评指正,共同学习!
相关文章推荐
- C/C++——求下面数据类型的最大值和最小值: char, short, int, long, float, double, long double和numeric_limits使用
- ActionForm使用java.util.Date数据类型解决方法(转)
- C++与Java使用SOCKET通信遇到的一种阻塞问题的解决
- [C++ VC MFC] VC常用数据类型使用转换
- 在JAVA中使用Socket和C#通讯的解决
- 使用TcpListener的AcceptSocket()方法和AcceptTcpClient()方法接受远端数据时,程序总是好像死机一样!请问如何解决?
- 使用SQL Sever版本不支持数据类型“date”的解决办法
- 如何正确使用Java I/O输出和读入数据
- 使用的 SQL Server 版本不支持数据类型“date”的解决方法
- Java数据类型 之 short的使用
- java中数据类型转换 Integer String Long Float Double Date
- 使用java + oracle插入clob类型的数据
- 使用Hibernate轻松解决java中date与datetime类型不兼容的问题
- 使用asx3m与xstream配合解决flex与java利用httpservice传递xml数据问题
- c++ 格式化中使用的数据类型
- 如何正确使用Java I/O输出和读入数据
- 如何正确使用Java I/O输出和读入数据
- 使用java + oracle插入clob类型的数据
- 解决hibernate中不能正常使用blog类型字段上传数据的问题
- C++/JAVA基本数据类型长度