官方网址: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. MDK stm32 仿真

    直接选择simulator,仿真时报错 *** error 65: access violation at 0x40021000 : no 'read' permission 修改系统配置,原配置如下 ...

  2. 滑杆(JSlider)和进度指示条(JProgressBar) 的使用

    package first; import javax.swing.*; import javax.swing.border.TitledBorder; import java.awt.*; impo ...

  3. kvm源代码分析

    vmx是x86硬件虚拟化层,从代码看,qemu用户态是一层,kernel中KVM通用代码是一层,类似kvm_x86_ops是一层,针对各个不同的硬件架构,而vcpu_vmx则是具体架构的虚拟化方案一层 ...

  4. Crontab无法自动执行,直接运行脚本却能执行

    Crontab无法自动执行,直接运行脚本却能执行 http://bbs.chinaunix.net/thread-1926428-1-1.html crontab -e crontab内容为* * * ...

  5. python清华大学镜像

    pip安装的-i参数: https://pypi.tuna.tsinghua.edu.cn/simple conda 设置: conda config --add channels https://m ...

  6. 《简明python教程》笔记三

    图形软件(GUI工具) 可供选择的GUI: 一.PyQT 是Qt工具包的python绑定.Qt工具包是构建KDE的基石.linux下使用免费,windows下使用收费. 二.PyGTK 是GTK+工具 ...

  7. 《JavaScript模式》精要

    P25. 如何避免eval()定义全局变量? 如: var jsstring = "var un = 1;"; eval(jsstring); console.log(typeof ...

  8. KVM(三)I/O 全虚拟化和准虚拟化

    在 QEMU/KVM 中,客户机可以使用的设备大致可分为三类: 1. 模拟设备:完全由 QEMU 纯软件模拟的设备. 2. Virtio 设备:实现 VIRTIO API 的半虚拟化设备. 3. PC ...

  9. docker从零开始(一)centos获取安装docker-ce

    卸载旧版本 较旧版本的Docker被称为docker或docker-engine.如果已安装这些,请卸载它们以及相关的依赖项. centos7 yum安装的docker就是docker-engine ...

  10. request.getServletContext()的问题!

    ServletRequest的getServletContext方法是Servlet3.0添加的,这个可以看一下官方文档 http://docs.oracle.com/javaee/6/api/jav ...