官方网址:http://javolution.org/apidocs/javolution/io/Struct.html

第一步:导包

第二步:创建继承的结构体

结构体定义如下所示:

  1. public class SKJ_RECORD_INFO extends Struct {
  2.  
  3. Unsigned8 infoID = new Unsigned8(); // 本数据结构标识,应为0x02
  4. Unsigned8 infoVersion = new Unsigned8(); // 本书数据结构格式版本,应为0x00
  5. Unsigned8 RecordLen = new Unsigned8(); // 交易记录的大小(字节数)。目前为80
  6. Unsigned8 RecordVersion = new Unsigned8(); // 交易记录格式版本号,目前为0x30
  7. Unsigned32 RecordMenSize = new Unsigned32(); // 交易记录存储空间总大小,单位:字节
  8. Unsigned16 RecordCntMax = new Unsigned16(); // 交易记录存储从简最大的记录数量
  9. Unsigned16 RecordCntTotal = new Unsigned16(); // 当前交易记录总数量,包括已采集的记录和未采集的记录
  10. Unsigned16 RecordCntCollected = new Unsigned16(); // 当前已采集的记录数量
  11. Unsigned16 RecordCntUnCollected = new Unsigned16(); // 当前尚未采集的记录数量
  12. Unsigned16 RecotdCntFree = new Unsigned16(); // 当前空闲的记录存储控件数量
  13.  
  14. public void putData(byte[] data) {
  15. int structLen = this.size();
  16.  
  17. byte[] temp = new byte[structLen];
  18. if (data.length >= structLen) {
  19. System.arraycopy(data, 0, temp, 0, structLen);
  20. } else {
  21. // 少于当前的结构的大小,以“0”来补充
  22. System.arraycopy(data, 0, temp, 0, data.length);
  23. }
  24. ByteBuffer buff = ByteBuffer.wrap(temp);
  25. buff.order(this.byteOrder());
  26. this.setByteBuffer(buff, 0);
  27. }
  28.  
  29. // 一定要加上这个,不然会出现对齐的问题
  30. @Override
  31. public boolean isPacked() {
  32. return true;
  33. }
  34.  
  35. // 设置为小端数据
  36. @Override
  37. public ByteOrder byteOrder() {
  38. return ByteOrder.LITTLE_ENDIAN;
  39. }
  40.  
  41. }

测试:

  1. public class SKJ_RECORD_INFOTest {
  2. @Before
  3. public void setUp() throws Exception {
  4. byte[] data = new byte[18];
  5. for (int i = 0; i < data.length; i++) {
  6. data[i] = (byte) i;
  7. }
  8.  
  9. SKJ_RECORD_INFO info = new SKJ_RECORD_INFO();
  10. ByteBuffer b = ByteBuffer.wrap(data);
  11. b.order(ByteOrder.LITTLE_ENDIAN);
  12. info.setByteBuffer(b, 0);
  13. System.out.println(info.size());
  14. System.out.println(info.infoID);
  15. System.out.println(info.RecotdCntFree);
  16. System.out.println("info.RecordMenSize:" + info.RecordMenSize);
  17. System.out.println(info.toString());
  18. System.out.println("-----");
  19. data[0] = 100;
  20. System.out.println(info.toString());
  21. }
  22.  
  23. @Test
  24. public void putData() throws Exception {
  25. }
  26.  
  27. }

结果:

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的属性也会跟着改变。

  1. public class SKJ_RECORD_INFOTest {
  2. @Before
  3. public void setUp() throws Exception {
  4. byte[] data = new byte[];
  5. for (int i = 0; i < data.length; i++) {
  6. data[i] = (byte) i;
  7. }
  8.  
  9. SKJ_RECORD_INFO info = new SKJ_RECORD_INFO();
  10. ByteBuffer b = ByteBuffer.wrap(data);
  11. b.order(ByteOrder.LITTLE_ENDIAN);
  12. info.setByteBuffer(b, 0);
  13. System.out.println(info.size());
  14. System.out.println(info.infoID);
  15. System.out.println(info.RecotdCntFree); -- 报错了
  16. System.out.println("info.RecordMenSize:" + info.RecordMenSize);
  17. System.out.println(info.toString());
  18. System.out.println("-----");
  19. data[0] = 100;
  20. System.out.println(info.toString());
  21. }
  22.  
  23. @Test
  24. public void putData() throws Exception {
  25. }
  26.  
  27. }

结果:

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()方法

  1. public void putData(byte[] data) {
  2. int structLen = this.size();
  3.  
  4. byte[] temp = new byte[structLen];
  5. if (data.length >= structLen) {
  6. System.arraycopy(data, 0, temp, 0, structLen);
  7. } else {
  8. // 少于当前的结构的大小,以“0”来补充
  9. System.arraycopy(data, 0, temp, 0, data.length);
  10. }
  11. ByteBuffer buff = ByteBuffer.wrap(temp);
  12. buff.order(this.byteOrder());
  13. this.setByteBuffer(buff, 0);
  14. }

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. express添加拦截器

    var express = require('express')   , routes = require('./routes')   , http = require('http')   , pat ...

  2. SpringMvc基础知识(一)

    目录: springmvc框架原理(掌握) 前端控制器.处理器映射器.处理器适配器.视图解析器 springmvc入门程序 目的:对前端控制器.处理器映射器.处理器适配器.视图解析器学习 非注解的处理 ...

  3. Git常用命令总结【转】

    转自:http://www.cnblogs.com/mengdd/p/4153773.html 查看.添加.提交.删除.找回,重置修改文件 git help <command> # 显示c ...

  4. pandas 读写sql数据库

    如何从数据库中读取数据到DataFrame中? 使用pandas.io.sql模块中的sql.read_sql_query(sql_str,conn)和sql.read_sql_table(table ...

  5. 2.flume架构以及核心组件

    flume组件主要包含三部分 source:从各个地方收集数据 channel:聚集,相当于临时数据存放的地方.因为数据来的时候,不可能来一条便写一次,那样效率太低,而是先把数据放在通道里,等通道满了 ...

  6. echarts 图表建立步骤

    需要引用的文件 <script src="web/mobile/js/jquery-1.8.3.min.js"></script> <script s ...

  7. 使用System.getProperty("line.separator")时没有换行问题解决

    项目中要实现替换模版txt文本里面的内容,然后生成新的文档,其中先把模版文本的内容通过创建的 BufferedReader bufReader 使用 readLine() 来一行一行读取,所以在完成替 ...

  8. MySQL 基础内容

    创建数据库 对于表的操作需要先进入库 use 库名: -- 创建一个名为 inana_db 的数据库,数据库字符编码指定为 utf8create database inana_db character ...

  9. java使用maven项目(二)分模块开发

    1       整合ssh框架 1.1     依赖传递 只添加了一个struts2-core依赖,发现项目中出现了很多jar, 这种情况 叫 依赖传递 1.2     依赖版本冲突的解决 1.  第 ...

  10. unity学习笔记1--Space Shooter

    其实我一直觉得我是个模棱两可的人,就计算机这块来说,自己还是想制作游戏什么的,但是又得考虑到现实就业的问题,所以现在自己主要在学安卓和javaweb.现在大概是心血来潮吧,突然想追逐下自己的理想,虽然 ...