官方网址:http://javolution.org/apidocs/javolution/io/Struct.html

第一步:导包

第二步:创建继承的结构体

结构体定义如下所示:

public class SKJ_RECORD_INFO extends Struct {

    Unsigned8 infoID = new Unsigned8();             // 本数据结构标识,应为0x02
Unsigned8 infoVersion = new Unsigned8(); // 本书数据结构格式版本,应为0x00
Unsigned8 RecordLen = new Unsigned8(); // 交易记录的大小(字节数)。目前为80
Unsigned8 RecordVersion = new Unsigned8(); // 交易记录格式版本号,目前为0x30
Unsigned32 RecordMenSize = new Unsigned32(); // 交易记录存储空间总大小,单位:字节
Unsigned16 RecordCntMax = new Unsigned16(); // 交易记录存储从简最大的记录数量
Unsigned16 RecordCntTotal = new Unsigned16(); // 当前交易记录总数量,包括已采集的记录和未采集的记录
Unsigned16 RecordCntCollected = new Unsigned16(); // 当前已采集的记录数量
Unsigned16 RecordCntUnCollected = new Unsigned16(); // 当前尚未采集的记录数量
Unsigned16 RecotdCntFree = new Unsigned16(); // 当前空闲的记录存储控件数量 public void putData(byte[] data) {
int structLen = this.size(); byte[] temp = new byte[structLen];
if (data.length >= structLen) {
System.arraycopy(data, 0, temp, 0, structLen);
} else {
// 少于当前的结构的大小,以“0”来补充
System.arraycopy(data, 0, temp, 0, data.length);
}
ByteBuffer buff = ByteBuffer.wrap(temp);
buff.order(this.byteOrder());
this.setByteBuffer(buff, 0);
} // 一定要加上这个,不然会出现对齐的问题
@Override
public boolean isPacked() {
return true;
} // 设置为小端数据
@Override
public ByteOrder byteOrder() {
return ByteOrder.LITTLE_ENDIAN;
} }

测试:

public class SKJ_RECORD_INFOTest {
@Before
public void setUp() throws Exception {
byte[] data = new byte[18];
for (int i = 0; i < data.length; i++) {
data[i] = (byte) i;
} SKJ_RECORD_INFO info = new SKJ_RECORD_INFO();
ByteBuffer b = ByteBuffer.wrap(data);
b.order(ByteOrder.LITTLE_ENDIAN);
info.setByteBuffer(b, 0);
System.out.println(info.size());
System.out.println(info.infoID);
System.out.println(info.RecotdCntFree);
System.out.println("info.RecordMenSize:" + info.RecordMenSize);
System.out.println(info.toString());
System.out.println("-----");
data[0] = 100;
System.out.println(info.toString());
} @Test
public void putData() throws Exception {
} }

结果:

18
0
4368
info.RecordMenSize:117835012
01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
10 11
-----
01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
10 11

说明了一个问题:当前的info和字节数据data是关联在一起的了。data的数据改变,其对应indo的属性也会跟着改变。

public class SKJ_RECORD_INFOTest {
@Before
public void setUp() throws Exception {
byte[] data = new byte[];
for (int i = 0; i < data.length; i++) {
data[i] = (byte) i;
} SKJ_RECORD_INFO info = new SKJ_RECORD_INFO();
ByteBuffer b = ByteBuffer.wrap(data);
b.order(ByteOrder.LITTLE_ENDIAN);
info.setByteBuffer(b, 0);
System.out.println(info.size());
System.out.println(info.infoID);
System.out.println(info.RecotdCntFree); -- 报错了
System.out.println("info.RecordMenSize:" + info.RecordMenSize);
System.out.println(info.toString());
System.out.println("-----");
data[0] = 100;
System.out.println(info.toString());
} @Test
public void putData() throws Exception {
} }

结果:

18
0

java.lang.IndexOutOfBoundsException
at java.nio.Buffer.checkIndex(Buffer.java:546)
at java.nio.HeapByteBuffer.getShort(HeapByteBuffer.java:314)
at javolution.io.Struct$Unsigned16.get(Struct.java:1294)
at javolution.io.Struct$Unsigned16.toString(Struct.java:1309)
at java.lang.String.valueOf(String.java:2994)
at java.io.PrintStream.println(PrintStream.java:821)
at com.lanhetech.core.collectInfo.SKJ_RECORD_INFOTest.setUp(SKJ_RECORD_INFOTest.java:23)
……

说明了另一个问题:当前的data数据小于结构体info的大小时,info.setByteBuffer(b, 0);不会出错,但是引用到没有不够长度的数据时,就会出错了。

为了解决以上2个问题,新增一个putData()方法

public void putData(byte[] data) {
int structLen = this.size(); byte[] temp = new byte[structLen];
if (data.length >= structLen) {
System.arraycopy(data, 0, temp, 0, structLen);
} else {
// 少于当前的结构的大小,以“0”来补充
System.arraycopy(data, 0, temp, 0, data.length);
}
ByteBuffer buff = ByteBuffer.wrap(temp);
buff.order(this.byteOrder());
this.setByteBuffer(buff, 0);
}

javolution-core-java-6.1.0.jar 的使用的更多相关文章

  1. 使用jasperreports-5.6.0.jar导致的问题

    使用jasperreports-5.6.0.jar导致的问题 Struts2+jasperReport5.6如下设置: <!-- 社员档案 --> <package name=&qu ...

  2. Core Java Volume I — 4.7. Packages

    4.7. PackagesJava allows you to group classes in a collection called a package. Packages are conveni ...

  3. Core Java 学习笔记——1.术语/环境配置/Eclipse汉化字体快捷键/API文档

    今天起开始学习Java,学习用书为Core Java.之前有过C的经验.准备把自己学习这一本书时的各种想法,不易理解的,重要的都记录下来.希望以后回顾起来能温故知新吧.也希望自己能够坚持把自己学习这本 ...

  4. Java 之 POI各Jar包作用

    目前POI的最新版本是 3.16-beta2,该版本是测试版本,稳定版本是 3.15,下载地址为 Apache POI (http://poi.apache.org/download.html). 一 ...

  5. java代码打包成jar以及转换为exe

    教你如何把java代码打包成jar文件以及转换为exe可执行文件 1.背景: 学习java时,教材中关于如题问题,只有一小节说明,而且要自己写麻烦的配置文件,最终结果却只能转换为jar文件.实在是心有 ...

  6. java利用Aspose.slides.jar将本地ppt文档转化成pdf(完美破解版 无水印 无中文乱码)

    下载aspose.slides-15.9.0.jar包 http://pan.baidu.com/s/1jH3ZNbK JAVA代码 package webViewer; import java.io ...

  7. Java学习-039-源码 jar 包的二次开发扩展实例(源码修改)

    最近在使用已有的一些 jar 包时,发现有些 jar 包中的一些方法无法满足自己的一些需求,例如返回固定的格式,字符串处理等等,因而需要对原有 jar 文件中对应的 class 文件进行二次开发扩展, ...

  8. 导入maven项目后无法找到sun tools toos-15.0.jar

    直接在缺失该jar包的pom中添加 以下属性和依赖即可! <java.home>D:\devtool\jdk1.6</java.home> <!-- 指定使用的JDK的安 ...

  9. Core Java Volume I — 1.2. The Java "White Paper" Buzzwords

    1.2. The Java "White Paper" BuzzwordsThe authors of Java have written an influential White ...

  10. 把java文件打包成.jar (jar命令详解)

    把java文件打包成.jar (jar命令详解) 先打开命令提示符(win2000或在运行框里执行cmd命令,win98为DOS提示符),输入jar Chelp,然后回车(如果你盘上已经有了jdk1. ...

随机推荐

  1. js中Date()对象详解

    var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年份(4位,1970-???? ...

  2. AOP编程的常用实现方式

    aop代理分为静态代理.jdk动态代理.cglib动态代理 通过动态代理的方式实现横向扩展,实现权限校验.日志等功能. jdk静态代理:代理类和委托类实现同一接口,并且在代理类中需要硬编码接口. jd ...

  3. YDB基本使用详解(转)

    第七章YDB基本使用详解 一.如何与YDB对接(交互) 目前延云YDB提供如下几种方式 l命令行的方式 lWeb http接口的方式 lJDBC接口的方式 通过Java编程接入 通过可视化SQL分析统 ...

  4. noip2016 提高组

    T1 玩具谜题 题目传送门 这道题直接模拟就好了哇 233 #include<cstdio> #include<cstring> #include<algorithm&g ...

  5. 【CF24D】Broken Robot (DP+高斯消元)

    题目链接 题意:给定一个\(n\times m\)的矩阵,每次可以向→↓←移动一格,也可以原地不动,求从\((x,y)\)到最后一行的期望步数. 此题标签\(DP\) 看到上面这个肯定会想到 方法一: ...

  6. [bzoj4518][Sdoi2016]征途-斜率优化

    Brief Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须 ...

  7. xcode自动打ipa包脚本

    http://blog.csdn.net/ccf0703/article/details/7999112 文章首发地址:http://webfrogs.github.com/IOS/2012/09/1 ...

  8. 一道面试题:C++相比C#或者java的优势到底在哪里

    被问到了这样一道面试题,当时就懵了,内心一直觉得C++肯定在很多方面要比C#或者java要牛b的. 但是真的不知道怎么回答. 问题是:你以前一直做得是.NET相关项目,现在为什么找C++开发相关工作呢 ...

  9. JAVA Eclipse 教程

    http://www.runoob.com/eclipse/eclipse-tutorial.html

  10. iOS开发-Runloop详解(简书)

    不知道大家有没有想过这个问题,一个应用开始运行以后放在那里,如果不对它进行任何操作,这个应用就像静止了一样,不会自发的有任何动作发生,但是如果我们点击界面上的一个按钮,这个时候就会有对应的按钮响应事件 ...