Android 和 windows C/C++/QT通讯时字节存储
ava:采用大端字节序存储数据【低地址存放数据的高位,高地址存放数据的低位,数据高位存放在数组的前面】
windows(intel平台):采用小端字节序存储数据【低地址存放数据的低位,高地址存放数据的高位,数据的高位存放在数组的后面】(windows接收java发送过来的short,int需要调用ntohs和ntohl来转换到小数端)
【数据高位】:0x1234的高位为0x12
【数据低位】:0x1234的低位为0x34
如:intihex=0x12345678;
shortshex=0x1234;
java内存中存储为:
byte[]={'0x12','0x34','0x56','0x78'} byte[]={'0x12','0x34'}
而windows下(intelcpu):
c/c++/qt存储为
一个字符数组地址是从首地址开始递增的,也就是数组下标越大,内存地址越大。
=====char[]前面是低地址,后面是高地址
char[]={'0x78','0x56','0x34','0x12'}//QByteArray和char[]一致 char[]={'0x34','0x12'}
设计java端client程序时,需要我们在程序中显式采用大端字节序来处理int,short,long(字符串不需要考虑),即将int,short,long转换成byte[]。【将short,int的高位存储在字符数组的前面】当然你想用小字节存放也可以,socket收到数据后打印出来看int,short的16进制数字节序,然后做处理即可。
函数如下:(大端字节序存储的函数)
/*整型转化成字符序列,类似的函数baidu可以找到很多
*执行位操作,将inti=0x12345678;对应二进制:
*内存中存放:低地址
*000100100x12
*001101000x34
*010101100x56
*011110000x78
*高地址
*/
//存放到byte[]={'0x12','0x34','0x56','0x78'}位置处
publicstaticbyte[]intToBytes(inti) { //bytes[0]=00010010 //bytes[1]=00110100 //bytes[2]=01010110 //bytes[3]=01111000 bytebytes[]=newbyte[4]; for(intj=3;j>=0;j--) bytes[3-j]=(byte)(i>>8*(3-j)&0xff);//bytes[0]:直接将i的低8bits和0xff与操作即可,此时j=3 returnbytes; }
publicstaticbyte[]shortToBytes(shorts) { bytebytes[]=newbyte[2]; bytes[0]=(byte)(0xFF&(s>>8));//低地址存放高位数据,低位数据被右移8bits后删除了。(返回高8位值) bytes[1]=(byte)(0xFF&s);//高地址存放低位数据,位操作当然是低位执行的与操作。当前只和8bits与,(即返回低8bits值) returnbytes; }
以上就是对androidjava和windowsC/C++/QT通讯时数据存放字节序的理解,有需要的可以参考下