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. ...
随机推荐
- express添加拦截器
var express = require('express') , routes = require('./routes') , http = require('http') , pat ...
- SpringMvc基础知识(一)
目录: springmvc框架原理(掌握) 前端控制器.处理器映射器.处理器适配器.视图解析器 springmvc入门程序 目的:对前端控制器.处理器映射器.处理器适配器.视图解析器学习 非注解的处理 ...
- Git常用命令总结【转】
转自:http://www.cnblogs.com/mengdd/p/4153773.html 查看.添加.提交.删除.找回,重置修改文件 git help <command> # 显示c ...
- pandas 读写sql数据库
如何从数据库中读取数据到DataFrame中? 使用pandas.io.sql模块中的sql.read_sql_query(sql_str,conn)和sql.read_sql_table(table ...
- 2.flume架构以及核心组件
flume组件主要包含三部分 source:从各个地方收集数据 channel:聚集,相当于临时数据存放的地方.因为数据来的时候,不可能来一条便写一次,那样效率太低,而是先把数据放在通道里,等通道满了 ...
- echarts 图表建立步骤
需要引用的文件 <script src="web/mobile/js/jquery-1.8.3.min.js"></script> <script s ...
- 使用System.getProperty("line.separator")时没有换行问题解决
项目中要实现替换模版txt文本里面的内容,然后生成新的文档,其中先把模版文本的内容通过创建的 BufferedReader bufReader 使用 readLine() 来一行一行读取,所以在完成替 ...
- MySQL 基础内容
创建数据库 对于表的操作需要先进入库 use 库名: -- 创建一个名为 inana_db 的数据库,数据库字符编码指定为 utf8create database inana_db character ...
- java使用maven项目(二)分模块开发
1 整合ssh框架 1.1 依赖传递 只添加了一个struts2-core依赖,发现项目中出现了很多jar, 这种情况 叫 依赖传递 1.2 依赖版本冲突的解决 1. 第 ...
- unity学习笔记1--Space Shooter
其实我一直觉得我是个模棱两可的人,就计算机这块来说,自己还是想制作游戏什么的,但是又得考虑到现实就业的问题,所以现在自己主要在学安卓和javaweb.现在大概是心血来潮吧,突然想追逐下自己的理想,虽然 ...