官方网址: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. CSS中的@ AT规则

    大家可能在CSS中见到过字符@然后加一些关键字的用法,这种用法就称之为AT规则,在CSS中,种类还是很多的,这里总结列举下. 常规规则 所谓“常规规则”指的是语法类似下面的规则: @[KEYWORD] ...

  2. 串的模式匹配算法(求子串位置的定位函数Index(S,T,pos))

    串的模式匹配的一般方法如算法4.5(在bo4-1.cpp 中)所示:由主串S 的第pos 个字 符起,检验是否存在子串T.首先令i 等于 pos(i 为S 中当前待比较字符的位序),j 等于 1(j ...

  3. 网络编程:connect函数

    TCP客户用connect函数来建立与TCP服务器的连接: cpp #include<sys/socket.h> int connect(int sockfd, const struct ...

  4. eclipse 4.2生成wsdl 客户端

    eclipse版本 4.2  64位  ,jdk 1.6   64位 Eclipse Java EE IDE for Web Developers. Version: Juno Service Rel ...

  5. POJ1286 Necklace of Beads

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8263   Accepted: 3452 Description Beads ...

  6. 【Git】GitHub之多人开发一个项目

    首先我们要简单知道github跟Git的区别.git是版本控制工具, github是一个面向开源及私有软件项目的托管平台,也是程序员交流的地方. 接下来就开始讲怎么多人一起开发. 首先我们先拥有git ...

  7. linux下使用wget下载整个网站

    linux下可以用wget下载整个网站,而且网站链接中包含utf-8编码的中文也能正确处理. 简要方法记录如下: wget --restrict-file-name=ascii -m -c -nv - ...

  8. 转载:超级强大的vim配置(vimplus)--续集

    超级强大的vim配置(vimplus)--续集 原文地址:https://www.cnblogs.com/highway-9/p/5984285.html An automatic configura ...

  9. 僵尸进程(zombie process)

    僵尸进程(zombie process) http://blog.csdn.net/crfoxzl/article/details/2124718 杀死Linux中的defunct进程(僵尸进程)的方 ...

  10. 关于easyui checkbox 的一些操作处理

    1.easyui在每一行加checkbox { field: 'id', title: '编号', checkbox: true } 2.easyui分页时记住前面已选的checkbox 设置easy ...