Android 和 windows C/C++/QT通讯时字节存储

作者:lqh 时间:2022-07-16 06:09:02 

ava:采用大端字节序存储数据【低地址存放数据的高位,高地址存放数据的低位,数据高位存放在数组的前面】

windows(intel平台):采用小端字节序存储数据【低地址存放数据的低位,高地址存放数据的高位,数据的高位存放在数组的后面】(windows接收java发送过来的short,int需要调用ntohs和ntohl来转换到小数端)

【数据高位】:0x1234的高位为 0x12

【数据低位】:0x1234的低位为 0x34

如: int ihex = 0x12345678;

short shex=0x1234;

java内存中存储为:


byte[] = { '0x12','0x34','0x56','0x78'}
byte[] = { '0x12','0x34'}

而windows下(intel cpu):

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可以找到很多
*执行位操作,将int i = 0x12345678; 对应二进制:
*内存中存放:低地址
*00010010 0x12
*00110100 0x34
*01010110 0x56
*01111000 0x78
*高地址
*/

// 存放到byte[]={'0x12','0x34','0x56','0x78'}位置处


public static byte[] intToBytes(int i)
{
//bytes[0] = 00010010
//bytes[1] = 00110100
//bytes[2] = 01010110
//bytes[3] = 01111000
byte bytes[] = new byte[4];
for (int j = 3; j >= 0; j--)
 bytes[3 - j] = (byte)(i >> 8 * (3 - j) & 0xff); //bytes[0] :直接将i的低8bits和0xff与操作即可,此时j=3

return bytes;
}

public static byte[] shortToBytes(short s)
{
byte bytes[] = new byte[2];

bytes[0]=(byte)(0xFF&(s>>8)); //低地址存放高位数据,低位数据被右移8bits后删除了。(返回高8位值)
bytes[1]=(byte)(0xFF&s); //高地址存放低位数据,位操作当然是低位执行的与操作。当前只和8bits与,(即返回低8bits值)

return bytes;
}
标签:android,java,windows,C/C++/QT通讯
0
投稿

猜你喜欢

  • idea2020.3.3集成maven及遇到的坑(推荐)

    2021-11-18 04:18:54
  • Spring中自动装配的4种方式

    2021-08-01 16:44:41
  • SpringBoot Redis用注释实现接口限流详解

    2022-03-15 17:40:55
  • SpringMVC数据页响应ModelAndView实现页面跳转

    2022-04-29 15:21:10
  • Flowable执行完毕的流程查找方法

    2023-01-30 08:53:36
  • c#调用qq邮箱smtp发送邮件修改版代码分享

    2023-04-03 11:11:31
  • Java中String类的常用方法总结

    2021-11-26 10:39:20
  • 实现Java删除一个集合的多个元素

    2021-09-19 10:41:28
  • Spring+Vue整合UEditor富文本实现图片附件上传的方法

    2022-09-27 10:36:13
  • mybatis-plus @DS实现动态切换数据源原理

    2023-07-09 21:44:23
  • Mybatis的mapper.xml中if标签test判断的用法说明

    2023-12-23 23:04:16
  • 基于java SSM springboot实现抗疫物质信息管理系统

    2021-12-01 13:46:34
  • Java详解实现多线程的四种方式总结

    2023-04-04 19:43:34
  • Android中GridView布局实现整体居中方法示例

    2023-12-23 13:21:18
  • C#中实现AES算法加密解读

    2022-09-17 16:49:36
  • MyBatis if test 判断字符串相等不生效问题

    2021-10-11 22:42:01
  • 基于Springboot一个注解搞定数据字典的实践方案

    2022-12-23 01:12:38
  • Java concurrency集合之LinkedBlockingDeque_动力节点Java学院整理

    2022-12-06 12:28:38
  • 通过Feign进行调用@FeignClient 找不到的解决方案

    2023-08-18 19:06:52
  • WPF实现动画效果(七)之演示图板

    2021-08-18 20:31:53
  • asp之家 软件编程 m.aspxhome.com