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

经过前面两篇博客的介绍,相信对于 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 block
			e.printStackTrace();
		}
	}
	
	public static void main(String args[]) {
		test t = new test();
		t.ArraysTest();
	}

输出结果如下:


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

动态分配方法

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

	@StructClass
	public 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 block
			e.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




猜你喜欢

转载自blog.csdn.net/jazzsoldier/article/details/75669757