Javolution大小端数据转换处理简介(java)

目录


1、问题情景

  • 1.1 问题
    传输或接收数据时,可能会遇到大小端数据排序的问题,在处理float类型数据的时候,小端排序 的
    字节数据用c/c# 可以轻松解析,用java却解析却需要经过移位操作,否则得不到正确结果,因为java
    默认是大端排序,所谓大端排序即高位在前,低位在后,小端即反之。

  • 1.2 处理方式
    处理这样的问题大致有两种方式:
    1. 根据数据的小端排列顺序经过一步步移位操作得到正确的数据顺序再进行解析,但这 样做非常麻烦,并且要求java程序员知道原始数据的小端排序结构,然而往往c程序员不会有这样的详细结构,所以实施起来有一定难度;
    2. 使用javolution框架,步骤:简单的引一下jar包;STEP1写一个继承javolution中Struct类的类,该类实际上是定义在javA程序中的C语言结构体,类中有需要转换成的数据结构,其顺序需要与实际获取的信息一致;STEP2写一个类做一些方法来做byte[]结构的转换;STEP3,程序中调用,调用的地方一些需要注意的问题。以下结合例子详解:例:定位信息新设备的定位信息读取,设备传到pc的字节顺序就是小端,需要做一些处理,以下简介。

2、使用javolution解决此类问题的示范

  • 2.1 STEP1:
    写一个继承struct的类,见图1代码UdpUtil,设置需要的属性结构,代码中的四个final属性为调用时传给方法的byte[]内的信息顺序,传了16个字节,四个字节一个数据,所以是四个变量,顺序与字节流信息顺序一致。byteOrder是设置小端的方法,必须有,且不能改为BIG_ENDIAN;属性的个数和值类型以及位数可根据实际情况改变;
    图一

  • 2.2 STEP2:
    另写一个实体类写调用方法,详见图2,如果该方法与第一个方法写在同一个类内会出现问题,代码中数据复制到另一个数组的部分可选可不选,如果传入的数据正好是需要的数据, 则不需要这部分代码功能上并没有区别。
    图二

  • 2.2 STEP3:

  • 调用方法见图3,第一步得到的结果应强转为图1 中的UdpUtil对象,然后 使用udpUtil.属性.get(); 直接就可以得到设置好的转换后的可直接存入数据库的数据类型。这里的 udpUtil.属性.get();中的属性即图1 udpUtil中设置的final变量,可对照判断。
    图三

备注:引用jar包的代码: compile ‘org.javolution:javolution-core-java:6.0.0‘ //写在build.gradle文件中
不使用IDEA可以直接引入jar包

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值