目录


  • 目录
  • 1问题情景
  • 2使用javolution解决此类问题的示范



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;属性的个数和值类型以及位数可根据实际情况改变;
  • java大端小端字节 java 大端 小端float_class

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

  • 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包