javolution-core-java-6.1.0.jar 的使用
官方网址: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 的使用的更多相关文章
- 使用jasperreports-5.6.0.jar导致的问题
使用jasperreports-5.6.0.jar导致的问题 Struts2+jasperReport5.6如下设置: <!-- 社员档案 --> <package name=&qu ...
- Core Java Volume I — 4.7. Packages
4.7. PackagesJava allows you to group classes in a collection called a package. Packages are conveni ...
- Core Java 学习笔记——1.术语/环境配置/Eclipse汉化字体快捷键/API文档
今天起开始学习Java,学习用书为Core Java.之前有过C的经验.准备把自己学习这一本书时的各种想法,不易理解的,重要的都记录下来.希望以后回顾起来能温故知新吧.也希望自己能够坚持把自己学习这本 ...
- Java 之 POI各Jar包作用
目前POI的最新版本是 3.16-beta2,该版本是测试版本,稳定版本是 3.15,下载地址为 Apache POI (http://poi.apache.org/download.html). 一 ...
- java代码打包成jar以及转换为exe
教你如何把java代码打包成jar文件以及转换为exe可执行文件 1.背景: 学习java时,教材中关于如题问题,只有一小节说明,而且要自己写麻烦的配置文件,最终结果却只能转换为jar文件.实在是心有 ...
- java利用Aspose.slides.jar将本地ppt文档转化成pdf(完美破解版 无水印 无中文乱码)
下载aspose.slides-15.9.0.jar包 http://pan.baidu.com/s/1jH3ZNbK JAVA代码 package webViewer; import java.io ...
- Java学习-039-源码 jar 包的二次开发扩展实例(源码修改)
最近在使用已有的一些 jar 包时,发现有些 jar 包中的一些方法无法满足自己的一些需求,例如返回固定的格式,字符串处理等等,因而需要对原有 jar 文件中对应的 class 文件进行二次开发扩展, ...
- 导入maven项目后无法找到sun tools toos-15.0.jar
直接在缺失该jar包的pom中添加 以下属性和依赖即可! <java.home>D:\devtool\jdk1.6</java.home> <!-- 指定使用的JDK的安 ...
- 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 ...
- 把java文件打包成.jar (jar命令详解)
把java文件打包成.jar (jar命令详解) 先打开命令提示符(win2000或在运行框里执行cmd命令,win98为DOS提示符),输入jar Chelp,然后回车(如果你盘上已经有了jdk1. ...
随机推荐
- Java多线程调试如何完成信息输出处理
转载自:http://developer.51cto.com/art/201003/189078.htm Java多线程调试是很繁琐的,但是还是需要我们不断进行相关的学习.下面我们就来看看在Java多 ...
- Python爬虫学习笔记之爬今日头条的街拍图片
代码: import requests import os from hashlib import md5 from urllib.parse import urlencode from multip ...
- CORS服务端跨域
跨域,通常情况下是说在两个不通过的域名下面无法进行正常的通信,或者说是无法获取其他域名下面的数据,这个主要的原因是,浏览器出于安全问题的考虑,采用了同源策略,通过浏览器对JS的限制,防止恶意用户获取非 ...
- commons
<!-- https://mvnrepository.com/artifact/commons-lang/commons-lang --> <dependency> <g ...
- php session 阻塞 过期不自动清除session文件
php默认session session_start后,php就会打开session文件,然后同一时间用户再用那个session_id访问,就会被前面那个请求阻塞直到前面一个访问结束才会释放文件在使 ...
- sublime text 2学习(二):创建可复用的代码片段
对于前端工程师来讲,写一个html页面的基本结构是体力活,每次去拷贝一个也麻烦,sublime text 2 提供了一个很好的复用代码片段.下面介绍一下创建一个html5的代码片段的过程. 在菜单上点 ...
- Red Hat EX413 通过笔记
最近通过了EX413考试,在这里记录一下- EX413是Red Hat RH413对应的考试,RH413主要涉及Linux主机加固内容.考试大概18题的样子,给两台虚拟机,然后按照各个题目要求进行安全 ...
- python函数篇:名称空间、作用域和函数的嵌套
一.名称空间:(有3类) (1)内置名称空间(全局作用域) (2)全局名称空间(全局作用域) (3)局部名称空间(局部作用域) 关于名称空间的查询: x=1 def func(): print('fr ...
- python3 json、logging、sys模块
json模块 import json dic = {'name':'egon','age':32} # ------------------------------>序列化 f = open(' ...
- Windows 的GUID
GUID(全称:Globally Unique Identifier),是一种由算法生成的二进制长度为128位的数字标识符.GUID主要用于在拥有多个节点.多台计算机的网络或系统中.在理想情况下,任何 ...