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 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




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403050.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android开发如何使用JNA

1. JNA&#xff08;Java Native Access&#xff09;项目已经迁移到 github&#xff0c;最新的项目链接&#xff1a;https://github.com/java-native-access/jna 。首先前往该地址下载使用 JNA 需要的两个 jar 库文件&#xff0c;jna.jar&#xff0c;jna-platform.jar 。 2. 在…

JAVA循环队列

关于自定义循环队列的实现原理和要点可以参见之前的博文系列&#xff1a;循环队列及C语言实现。这里主要对JAVA下的具体实现方式与原理进行说明。 一、JAVA 中已经自带了 Queue、DQueue、ArrayList、LinkedList 等常用的数据结构&#xff0c;为什么还要单独实现循环队列&#…

VMware 虚拟机占用磁盘空间

使用VMware创建的虚拟机尽管已经设定分配的磁盘大小&#xff0c;但仍然会发现虚拟机占用的磁盘空间会越来越大&#xff0c;而直观体现就是虚拟机系统文件 vmdk 不断增大。因此下面介绍一个简单的方法&#xff0c;使用 VMware 自带的工具对 vmdk 文件进行压缩以节省磁盘空间。拿…

frameworks/av/media/CedarX-Projects/CedarAndroidLib/LIB_KK44_/Android.mk: No such file or directory

在安卓系统编译过程中如果遇到上述或者与之类似的错误&#xff0c;可以采取相同的处理方法进行解决。直接进入到 CedarAndroidLib 目录下&#xff0c;也即此例中的 frameworks/av/media/CedarX-Projects/CedarAndroidLib。看一下当前文件&#xff1a; 注意第9行为包含标题中报错…

Windows与Linux下tftp服务的使用

tftp 协议是基于 udp 的&#xff0c;轻量小巧&#xff0c;用在局域网和嵌入式上很顺手。大部分帖子把在 linux 上配置的过程描述的过于复杂&#xff0c;其实只是个工具而已。研究协议抓下包对比协议内容也可以满足需求了&#xff0c;下面进入正文。分别讲下在 linux 以及 windo…

饥荒Mod 开发(二二):显示物品信息

饥荒Mod 开发(二一)&#xff1a;超大便携背包&#xff0c;超大物品栏&#xff0c;永久保鲜 饥荒中的物品没有详细信息&#xff0c;基本上只有一个名字&#xff0c;所以很多物品的功能都不知道&#xff0c;比如浆果吃了也不知道恢复什么&#xff0c; 采集的胡萝卜也不知道什么功…

安卓BLE开发教程(一) BLE基础

我试图以一种简单的方式去把重要的事情讲清楚。目的是希望BLE协议栈和基础概念简单化&#xff0c;让自己及类似的安卓开发者可以在较短的时间内把握住BLE的核心及使用方法。BLE本身很复杂&#xff0c;但对于安卓开发而言只要抓住一些核心点&#xff0c;便已足够。如果你想全面了…

Linux驱动如何在不同版本上快速迭代升级

As well known&#xff0c;Linux内核版本更新很快&#xff0c;有些内核版本的迭代升级可能会导致在使用的驱动版本存在编译失败或使用的兼容性问题&#xff0c;如何快速定位到内核版本间变更的地方&#xff0c;并处理掉该问题&#xff0c;列一下我常用的解决方法。&#xff08;…

苹果MacOS系统上安装第三方驱动失败/无效

近期不少用户在苹果系统上安装一些第三方驱动时反馈没有作用&#xff0c;但是驱动安装提示是完成的&#xff0c;并拷贝到了系统的驱动路径下&#xff1b;造成该问题的原因可参见如下苹果官方说明&#xff1a; User-Approved Kernel Extension Loading 引用下第一段官网说明 …

OpenWrt 之 MT7628 移植第三方SPI驱动

1、在OpenWrt系统上移植SPI驱动前&#xff0c;首先要确保SPI相关引脚未被复用为其他功能&#xff0c;比如GPIO&#xff1b;以下操作已假定该条件成立&#xff0c;否则请修改相关dts和c文件中复用配置&#xff1b; 2、打开dts配置文件进行修改&#xff0c;这里我是用的硬件为WR…

CH9102 USB转串口应用体验

近期使用CH9102 USB转串口芯片成功用在原有使用CP2102的产品板上&#xff0c;整个替换和验证过程还是很顺利的&#xff0c;顺带写个blog做个记录。 原项目上使用CP2102搭载ESP32实现Arduino物联网应用&#xff0c;采用USB转串口芯片实现串口下载&#xff0c;代码的Debug调试&am…

CH9101 USB转串口替换FT232R和FT230XQ

学生党一枚&#xff0c;前段时间跟着导师做的项目因为上面用到USB转串口芯片FT232R迟迟买不到&#xff0c;所以打算更换成国产USB转串口芯片CH340&#xff0c;对CH340的认识也很早了&#xff0c;很多年前开始直到现在各种开发板上基本都会标配一颗CH340&#xff0c;像某宝上的S…

FT230X芯片的国产化替代

之前有些项目用到FT230XQ芯片&#xff0c;无奈不好买&#xff08;价格高&#xff09;&#xff0c;想找些替代的型号。原先使用国产CH340芯片比较多&#xff0c;顺带去官网找下有没有其他小封装的芯片型号。导航比较方便&#xff0c;从官网的产品中心&#xff0c;选择“USB”分类…

Java Code之多态

Java代码 package com.iteye.badpie.javacode.duotai; /** * 人民警察 */public interface IPolice { /** * 抓小偷 */public void catchThief(); }package com.iteye.badpie.javacode.duotai;/*** 人民警察*/ public interface IPolice {/*** 抓小偷*/public void catch…

最小生成树之prim

prim是设置一个初始结点&#xff0c;寻找其周围最小的边权值&#xff0c;并将该结点作为初始结点&#xff0c;继续寻找现在结点周围的边权值的最小值&#xff0c;但要注意如果这次寻找的某个边权值没有上次的小的话仍然保留上一次的边权值&#xff0c;即lowcast的值将会不变。 …

element-ui自定义表头;el-table自定义表头;render-header自定义表头

自定义表头有两种方式&#xff1a;一种是使用render-header 一种是通过设置 Scoped slot 来自定义表头 一、render-header方式 场景&#xff1a;给表头设置自定义按钮&#xff0c;点击时候 批量下载或做其他事件 给当前的那列设置 :render-header <el-table-column align&…

vue项目转rem;H5配置rem;px转rem

H5可以配合vant组件库书写项目&#xff0c;和使用rem后vant组件样式变小了解决办法。&#xff08;引入方式&#xff09; 以下是配置rem步骤&#xff1a; 1.安装 flexible和 postcss-px2rem&#xff08;命令行安装&#xff09; lib-flexible 会自动在为你添加 meta name“viewp…

git代码回滚到以前某一版本

1.使用 git log 查看之前提交的版本&#xff0c;每一版对应的hash值&#xff0c;默认展示几条&#xff0c;如果想查看更多&#xff0c;一直按回车。 git reset --hard 目标版本hash值 &#xff0c;注意&#xff1a;这一步操作完后&#xff0c;目标版本之后的代码将全部清掉&am…

python发送各类邮件的主要方法

From: http://www.cnblogs.com/xiaowuyi/archive/2012/03/17/2404015.html python中email模块使得处理邮件变得比较简单&#xff0c;今天着重学习了一下发送邮件的具体做法&#xff0c;这里写写自己的的心得,也请高手给些指点。 一、相关模块介绍 发送邮件主要用到了smtplib和e…

图片保持比例自适应大小;图片保持比例自动充满父元素;图片保持比例充满盒子

需求&#xff1a;经常会有一个div盒子&#xff0c;里面放入一个img图片。需要是图片保持比例&#xff0c;缩放充满div盒子。 思路&#xff1a; 1.必须给父元素设置固定的宽高。2.给img设置 object-fit: scale-down; 属性 object-fit使用学习 先看效果&#xff1a; <!DOCTYP…