Java 结构体之 JavaStruct 使用教程<三> JavaStruct 数组进阶
来源:互联网 发布:setup.exe mac 打不开 编辑:程序博客网 时间:2024/06/16 00:27
经过前面两篇博客的介绍,相信对于 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 数组进阶
- Java 结构体之 JavaStruct 使用教程<一> 初识 JavaStruct
- Java 结构体之 JavaStruct 使用教程<二> JavaStruct 用例分析
- Java 结构体之 JavaStruct 第三方库
- javastruct
- java.io.IOException: The same input jar [***\libs\javastruct-0.1.jar] is specified twice
- SUNWEN教程之----C#进阶(三)_C#教程
- SUNWEN教程之----C#进阶(三)_C#教程
- Java进阶(十九)数组(下)之数组的使用
- NSIS进阶教程(三)
- NSIS进阶教程(三)
- WinCE实验教程之三文件夹结构
- WinCE实验教程之三文件夹结构
- Java进阶之虚拟机《三》:类初始化
- Zend Studio 6 + Zend Framework进阶教程之三
- Zend Studio 6 + Zend Framework进阶教程之三
- JS的进阶上山打怪咯之数组(三)
- C语言基础之结构体进阶
- Win7系统搭建FTP服务器
- Linux命令行终端提示符实用技巧
- 服务机器人让你拥抱智慧生活
- Mapper 文件编写技巧
- hadoop2 (2017-7-21修改)对SequeneceFile 的(读写)操作
- Java 结构体之 JavaStruct 使用教程<三> JavaStruct 数组进阶
- 中国标准时间转换成DateTime
- POJ 3468 A Simple Problem with Integers (线段树 区间共加)
- 数据立方体----维度与OLAP
- lhgdialog个人整理
- linux命令---sed
- CUDA Samples: Dot Product
- Android开发控件-VarietyImageView(百变ImageView,可以根据要求指定哪个角是圆角,哪个角是直角)
- 《Python核心编程习题》---chapter9