官方网址: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. 微信小程序基础知识

    一.基本目录结构 app.js 定义app入口 app.json 定义页面配置 index.js 页面中的事件和监听 index.wxml 定义布局文件 1.app.json配置基本信息 { “pag ...

  2. Java节假日算法

    类:Vacation package test; import java.io.Serializable; import java.util.Date; public class Vacation i ...

  3. 【hdu2825-Wireless Password】AC自动机+DP

    http://acm.hust.edu.cn/vjudge/problem/16883 题意:要构造一个长度为n的字符串,然后有m模板串构成一个集合(m<=10),构造出来的字符串至少含有k种模 ...

  4. C++ 头文件保护符

    头文件保护符有什么作用? 在C++中我们写头文件时经常需要#include来包含其他头文件.头文件定义的实体经常使用其他头文件的内容,有时候会出现一个头文件被多次包含进同一源文件. 例如:一个头文件中 ...

  5. UVALIVE 3891 The Teacher's Side of Math

    One of the tasks students routinely carry out in their mathematics classes is to solve a polynomial ...

  6. 【linux】kill ;杀死某一用户下的所有进程

    [linux]kill :杀死某一用户下的所有进程 https://my.oschina.net/u/347414/blog/600854

  7. 【Android开发日记】之入门篇(十三)——Android的控件解析

    Android的控件都派生自android.view.View类,在android.widget包中定义了大量的系统控件供开发者使用,开发者也可以从View类及其子类中,派生出自定义的控件. 一.An ...

  8. 使用pipeline管道执行redis命令

    pipeline管道可以减少后端与redis的连接次数,从而实现了优化. 原理如下: 使用方法: 未使用pipeline前: strict_redis = get_redis_connection(' ...

  9. vue学习记录:vue引入,validator验证,数据信息,vuex数据共享

    最近在学习vue,关于学习过程中所遇到的问题进行记录,包含vue引入,validator验证,数据信息,vuex数据共享,传值问题记录 1.vue 引入vue vue的大致形式如下: <temp ...

  10. KVM的qemu-kvm使用

    KVM: kvm,x86支持硬件辅助虚拟化技术(hvm) grep -E "(vmx|svm)" /proc/cpuinfo [root@dmsag ~]# ll /dev/kvm ...