c语言和java 使用socket通信的时候 数据大小端转换的问题

Python011

c语言和java 使用socket通信的时候 数据大小端转换的问题,第1张

我也搞网络编程搞好久了,大小端这个问题倒是没有遇到过啊,我同事做Java,我做IOS都一样的,都是小端的。

建议你用抓包软件抓下包看看,还有就是注意发送时数据对齐问题,不同的系统可能一样的类型长度就不一样,比如在mac系统中long型有8字节,但是在IOS、VC中就只有四个字节,一般使用socket发送数据时都是打包发送的(头部一般都是固定的结构体),这个问题必须要注意

一个数需要超过一个字节来存储时,就有大端和小端的区别,只用一个字节时,无所谓大小端

低位的放在低地址,也就是小个在前,叫小端,反之叫大端

c和c++需要面对这样的问题,java等高级语言已经屏蔽这个差异,不需要额外处理

在c中,可以用以下代码片段来判断是大端还是小端

union {char cint i} u

u.i = 1

if(u.c == 1){//小端}

else{//大端}

项目中要将坐标数据进行传输,自然用到float基本类型转byte。但跨平台联调时发现android发出得数据在ios端解析出来的坐标不对。但自身调试都正常。看了ByteBuffer源码发现ByteBuffer有个order方法。百度了一下才发现原来java平台和c平台对byte有大小端排序。而且java默认使用大端排序,c默认使用小端排序。至此基本明白为什么解析数据不对得问题。2边数据结构不一致。解决办法2边都使用一致得排序。

代码如下:android