解决C++与Java 使用Socket Float数据类型的正确互传
来源:互联网 发布:人头气球 知乎 编辑:程序博客网 时间:2024/06/06 00:23
本人在大三做一个不同小组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++端接收
本码农第一次写博客,语句或许晦涩难懂,所言之处或许漏洞百出,还望各位大牛批评指正,共同学习!
- 解决C++与Java 使用Socket Float数据类型的正确互传
- Java `float` 数据类型的解说
- Java基本数据类型:long与float之间的转换疑惑
- 定义数据类型时float double的使用
- Java float数据类型
- Java与C连动时的数据类型分析
- java与C语言的数据类型对应
- float与position的使用
- float与position的使用
- 对display:inline与float:left正确含义的认识!
- display:inline与float:left的正确解释
- C#Socket的使用与示例
- Java与C之间的socket通信
- Java与C之间的socket通信
- Java与C之间的socket通信
- java与c之间的socket通讯
- C++与Java使用SOCKET通信遇到的一种阻塞问题的解决
- ORACLE的数据类型float
- 阿拉伯数字转英文
- 【java】归并排序 逆序对数
- Java的特点
- mysql 定时器
- 12期 5月期刊自荐
- 解决C++与Java 使用Socket Float数据类型的正确互传
- exel复制粘贴内容生成表格,相同项合并
- spring4学习记录03-spring mvc实战之框架构建
- Oracle merge into原来可以这么写
- 百家号如何更好的解决限流去运营获得收益呢?
- oracle 12c rac关闭pdb出现ORA-01155异常
- 十三.Scala数组
- 集成腾讯bugly的热修复功能sdk步骤
- mysql中文乱码