经过前面两篇博客的介绍,相信对于 JavaStruct 的认识以及编程使用,读者已经有一定的基础了。只要理解和实践结合起来,掌握还是很容易的。下面进行一些数组使用方面的实例说明及演示。

在结构体类中使用数组有几种方式,可以使用静态指定大小的方式也可以通过使用 ArrayLengthMaker 进行动态分配。数组的大小既可以在类中定义,也可以在定义对象后通过对象进行指定。

静态指定方法

如下所示:

 @StructClass public class ArrayStruct { @StructField(order = 0) public byte[] b = new byte[4];@StructField(order = 1)public char[] c = new char[2];@StructField(order = 2)public short[] s;@StructField(order = 3)public int[] i;}public void ArraysTest() {ArrayStruct arr = new ArrayStruct();Arrays.fill(arr.b, (byte) 1);Arrays.fill(arr.c, (new String("我")).charAt(0));arr.s = new short[0];arr.i = new int[0];try {byte[] b = JavaStruct.pack(arr);for (int i = 0; i < b.length; i++) {System.out.printf("b[%d]: %d\n", i, b[i]);}ArrayStruct arr2 = new ArrayStruct();arr2.s = new short[0];arr2.i = new int[0];JavaStruct.unpack(arr2, b);System.out.println("arr2.b: " + Arrays.toString(arr2.b));System.out.println("arr2.c: " + Arrays.toString(arr2.c));} catch (StructException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static void main(String args[]) {test t = new test();t.ArraysTest();}

输出结果如下:

Note:在数组中未分配空间的数组一定要在定义对象后分配空间,不然会报空指针错误。其次解析与反解析要注意定义的数组大小匹配,这一点也要切记,不然会报错。与 C 中结构体不同的是,类中指定大小后,可以创建对象后,再重新分配数组大小。这时,数组大小就以重分配大小为准,这也是一种灵活性的体现。当然,原理就是类定义是不占用内存空间的,只有定义对象后才有对应空间存在。

动态分配方法

通过使用 ArrayLengthMaker 的方式,javastruct 可以在打包及解包操作中操作数组字段时自动使用长度字段中的值。直接看如下实例:

 @StructClasspublic class AString {@StructField (order = 0 )@ArrayLengthMarker (fieldName = "chars")public int length;@StructField (order = 1)public char[] chars;public AString(String content){this.length = content.length();this.chars = content.toCharArray();}}public void TestAString() {//构造 str 对象时,执行相应构造方法后,长度字段为4。AString str = new AString("我爱中国");try {byte[] b = JavaStruct.pack(str, ByteOrder.BIG_ENDIAN);for (int i = 0; i < b.length; i++) {System.out.printf("b[%d]: %d\n", i, b[i]);}AString str2 = new AString("");JavaStruct.unpack(str2, b, ByteOrder.BIG_ENDIAN);System.out.println("str2: " + str2.length);System.out.println("str2: " + Arrays.toString(str2.chars));} catch (StructException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static void main(String args[]) {test t = new test();t.TestAString();}

输出结果如下:

可以看到对象共占有12个字节的空间,长度为int型,占4个字节。后面的 char 型数组共占8个字节,可确认其长度为4。以上示例即为完整的打包与解包过程了。

关于 JavaStruct 应用的文章系列,可以移步至如下链接:

1. 《Java 结构体之 JavaStruct 使用教程<一> 初识 JavaStruct》

2. 《Java 结构体之 JavaStruct 使用教程<二> JavaStruct 用例分析》

3. 《Java 结构体之 JavaStruct 使用教程<三> JavaStruct 数组进阶》

有任何疑问或使用问题可以给我评论或者邮件哦,觉得有用就点赞吧~:-D



Java 结构体之 JavaStruct 使用教程三 JavaStruct 数组进阶相关推荐

  1. Java 结构体之 JavaStruct 使用教程二 JavaStruct 用例分析

    使用环境 前一篇在介绍 JavaStruct 类时指定了使用库使用环境为 Java 5 及以上,也即开发我们使用的 JDK 版本为1.5及以上就可以了.以下讲解的用例可以直接将 code 直接粘贴到 ...

  2. Java 结构体之 JavaStruct 使用教程一 初识 JavaStruct

    Javastruct 是什么 简而言之,Javastruct 是一个第三方库,用于像处理 C 或者 C++ 结构体那样处理 java 对象.也即利用 Javastruct 可以在 java 上实现类似 ...

  3. java 结构体数组初始化_C数组结构体联合体快速初始化

    背景 C89标准规定初始化语句的元素以固定顺序出现,该顺序即待初始化数组或结构体元素的定义顺序. C99标准新增指定初始化(Designated Initializer),即可按照任意顺序对数组某些元 ...

  4. java 结构体_Java实现单链表的简单操作

    文章目录 前言 一.基本实现思路 二.代码实现 1.定义结点类2.定义链表类3.测试调用4.结果 总结 前言 用Java实现单链表的简单操作,阅读本文和上一篇文章体会Java中类与C++中结构体指针的 ...

  5. java结构体构建学生 学号_易错题: 程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。...

    根据网考网考试中心的统计分析,以下试题在2015-12-7日计算机二级考试C语言习题练习中,答错率较高,为:93% [填空题] 程序通过定义学生结构体变量,存储了学生的学号.姓名和3门课的成绩.所有学 ...

  6. c语言设计学生结构体,c语言程序设计编程题目:请 :编写完成对学生相关信息的要求:1.定义一个结构体类型student,其中包括三个成...

    #include #include #define STU_NUM 10 /*宏定义学生的数量*/ struct student /*定义一个结构体用来存放学生学号.三门课成绩.总分及平均成绩*/ { ...

  7. java结构体构建学生 学号_(1)定义一个结构体数组,存放10个学生的学号,姓名,三门课的成绩; 急求...

    展开全部 之前写过一个记录学生学号,年龄,体重e5a48de588b63231313335323631343130323136353331333365636132,名字的数组结构,你可以稍作修改就可以 ...

  8. java 结构体拷贝_对象拷贝 - 优雅的解决方案 Mapstruct

    是否一直在使用BeanUtils.copyProperties 用于对象属性拷贝. 出现种种小问题. 会将同名属性拷贝到另外一个对象中,操作方便但是存在一个缺陷 (速度慢) 有些同名字段却无法进行特殊 ...

  9. 第十章 结构体_C语言随机数生成教程,C语言rand和srand用法详解

    在实际编程中,我们经常需要生成随机数,例如,贪吃蛇游戏中在随机的位置出现食物,扑克牌游戏中随机发牌. 在C语言中,我们一般使用 <stdlib.h> 头文件中的 rand() 函数来生成随 ...

最新文章

  1. 计算机网络实验五:虚拟局域网技术
  2. POJ 3621 Sightseeing Cows
  3. 如何通过apache运行php,apache-2.2 – 如何使所有URL通过单个PHP文件运行?
  4. c语言 读取 文件大小,c – ifstream :: ifstream可以读取的最大文件大小是多少
  5. Java环境变量的设置
  6. db2怎么限定查询条数_如何查询各国进口关税税率!
  7. 书籍推荐:零基础入门学习Python
  8. 103.及时清除缓存
  9. CAS方式实现单点登录
  10. 【React】JSX 语法及原理
  11. zuma族蚂网优化日志:SEO网站跳出率
  12. 1005打印任务取消不了 hp_Windows10+HP M176N奇怪的发送打印命令不执行任务就消失的问题...
  13. No property creategoryType found for type xxx! Did you mean ‘xxx‘?
  14. Tomcat : 修改Tomcat端口号
  15. 474922-22-0,DSPE-PEG2000-Mal,磷脂酰乙醇胺-聚乙二醇2000-马来酰亚胺
  16. 英语和数学不好,能学编程吗?
  17. 老笔记本电脑机械500GB升级固态1T
  18. 群晖nas介绍文档_群晖 NAS 选购 入门指南:动手打造自己的家庭数据中心
  19. 运营笔记:老板最不关心的就是微信公众号外包报价表!
  20. GaitSet论文复现中遇到的部分问题解决(CASIA-B数据集)

热门文章

  1. 从Jupyter Notebook到脚本
  2. 实现klib_使用klib加速数据清理和预处理
  3. react开发模式_通过开发带有精灵动画的游戏来学习高级React模式
  4. 034_nginx报错总结
  5. Leetcode589.N-ary Tree Preorder TraversalN叉树的前序遍历
  6. Struts2学习---基本配置,action,动态方法调用,action接收参数
  7. Atitit  数据存储的分组聚合 groupby的实现attilax总结
  8. 【BZOJ1085】骑士精神
  9. 项目回顾1-图片上传-form表单还是base64-前端图片压缩
  10. JS 计算日期天数差