javaStruct - 通讯协议的解封包第三方库--(二)官方文档二
原文链接
https://code.google.com/archive/p/javastruct/
翻译用工具
翻译使用的是个人免费版Transmate
译文
简介
当与嵌入式设备和其他使用C语言样式的结构体的应用协同工作时,结构体类能非常简便地用于Java应用的网络协议编程。
不需要手动编解码消息,JavaStruct允许开发者对待java类就像C结构体。
JavaStruct使用Java5声明以将类或成员变量标记为结构体。JavaStruct 并不是第一种尝试提供类结构体功能的。Jean-Marie Dautelle 的 Javolution 库也是一个优秀的结构体实现。但是区别于Javolution使用特定类,JavaStruct是要用更简单的POJO方式。
一般性的使用
JavaStruct 装饰类用于封包和解包结构体类。下面是一个测试结构体类的简单的单元测试。结构体字段有一个顺序值,因为Java JVM的规范中并没有关于类成员顺序的信息。在Sun公司的实现中是按照他们的出现顺序,但是在其他JVM中则不一定。所以每一个结构体字段需要给定一个顺序值。
@StructClass
public class Foo{ @StructField(order = 0) public byte b; @StructField(order = 1) public int i;
}
try{ // Pack the class as a byte buffer Foo f = new Foo(); f.b = (byte)1; f.i = 1; byte[] b = JavaStruct.pack(f); // Unpack it into an object Foo f2 = new Foo(); JavaStruct.unpack(f2, b);
} catch(StructException e){ }
如果有任何错误,结构体操作将抛出一个StructException异常。
结构体类也能被流直接使用。请参考Photoshop ACB文件阅读器例子。
public void read(String acbFile){ try { FileInputStream fis = new FileInputStream(new File(acbFile));header = new ACBHeader(); StructUnpacker up = JavaStruct.getUnpacker(fis, ByteOrder.BIG_ENDIAN); up.readObject(header); ...
基本类型
使用基本类型。注意私有(private)域和受保护(protected)域需要合适的getter和setter方法。临时字段(transient fields)将被自动排除。
@StructClass
public class PublicPrimitives implements Serializable { @StructField(order = 0) public byte b; @StructField(order = 1) public char c; @StructField(order = 2) public short s; @StructField(order = 3) public int i; @StructField(order = 4) public long lo; @StructField(order = 5) protected float f; @StructField(order = 6) private double d; transient int blah; transient double foo; public float getF() { return f; } public void setF(float f) { this.f = f; } public double getD() { return d; } public void setD(double d) { this.d = d; } public boolean equals(Object o) { PublicPrimitives other = (PublicPrimitives)o; return (this.b == other.b && this.c == other.c && this.s == other.s && this.i == other.i && this.lo == other.lo && this.f == other.f && this.d == other.d); }
}
数组
数组有一些先决条件。当解包时,数组中需要有足够的空间。仅仅数组在解包时自动分配,其长度可以是null由其他字段使用数组长度标记(ArrayLengthMarker)定义(见下面章节)。除此之外数组不能是空和未初始化。
@StructClass
public class PublicPrimitiveArrays{@StructField(order = 0)public byte[] b = new byte[5]; @StructField(order = 1) public char[] c = new byte[10]; @StructField(order = 2) public short[] s; @StructField(order = 3) public int[] i;
}
数组长度标记
数组长度标记对于那些自身长度由其他字段定义的字段非常有用,看如下例子。这是一个特别的字符串结构体,其有一个长度字段,长度值16 bit 字母随其后。
±-------±----------------------//----------------------------------------+ | Length | UTF-16 Characters \ | ±-------±----------------------//----------------------------------------+
为处理它,我们要构建一个结构体类来表示这些字符串,姑且叫它 A 结构体。长度字段应该使用“数组长度标记”声明。这样在解封包操作过程中处理数组字段时,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(); }
...
}
javaStruct - 通讯协议的解封包第三方库--(二)官方文档二相关推荐
- javaStruct - 通讯协议的解封包第三方库--(二)官方文档一
原文链接 https://code.google.com/archive/p/javastruct/ 翻译用工具 翻译使用的是个人免费版Transmate 译文 javastruct 一个将java对 ...
- javaStruct - 通讯协议的解封包第三方库--(二)官方文档三
原文链接 https://code.google.com/archive/p/javastruct/wikis/example_photoshop_acb_file_reader_writer.wik ...
- python数据科学和机器学习常用库的官方文档
文章目录 Matplotlib Numpy Pandas sklearn sklearn_crfsuite SciPy Matplotlib 进入matplotlib官网地址:https://matp ...
- python 笔记 :Gym库 (官方文档笔记)
Gym是一个开发和比较强化学习算法的工具箱.它不依赖强化学习算法结构,并且可以使用很多方法对它进行调用. 1 Gym环境 这是一个让某种小游戏运行的简单例子. 这将运行 CartPole-v0 环境实 ...
- 【清单】语言、框架及库的官方文档、examples、tutorials
spark:Quick Start tensorflow: 官方文档中文版:介绍 | TensorFlow 官方文档中文版 tutorials:Get Started with TensorFlow
- Poco 库开发-教你如何读Poco的官方文档
引言 在使用任何一种框架开发的时候,都不免要阅读官方的文档. 下面就讲述如何来读Poco库的官方文档 Poco库 在我们下载好Poco 后,会有两个文件夹,一个是放文档的doc,另外一个就是代码了,这 ...
- 如何快速一次性卸载所有python包(第三方库)呢
这篇文章主要介绍了如何快速一次性卸载所有python包(第三方库)呢,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 很多时候我们 ...
- 官方文档链接(Core Graphics、View Controller、UICollectionView、UITableView、第三方库)
Core Graphics Quartz 2D Programming Guide Core Graphics (Framework) Drawing(UIKit).Images and PDF(UI ...
- 模块开发之React使用第三方库PropTypes属性限制(十二)
模块开发之React使用第三方库PropTypes属性限制(十二) 前言 这是一个纯配置的第三方库模块,所以我们需要掌握知识不需要太详细.能知道并拿来即用即可. 下面以使用该模块的背景展开,然后介绍使 ...
最新文章
- attiny13a程序实例_ATtiny13A带A新版本
- 何以为「我来」?全方位解读笔记新秀高速增长
- 急速收藏:4套iOS SDK的H5打通方案
- 团队作业4——第一次项目冲刺(Alpha版本)3rd day
- DMDW集群配置到DEM
- 模拟RabbitMQ网络分区
- 得到classpath和当前类的绝对路径的一些方法
- android 解析错误 真机,AndroidStudio使用真机调试时出的一些bug
- 信息安全工程师笔记-综合知识冲刺(一)
- 面试题:二叉树中和为某一路径
- java开发者工具开源版_开源工具如何帮助飓风受害者
- fiddler实现后端接口 mock(不需要修改开发代码)
- 3D博物馆虚拟纪念馆数字博览厅的“另类”展现方式
- Linux查看文件大小的命令du的简单介绍
- Docker - 相较于虚拟机的优势,以及为什么要使用docker
- android authority root galaxy s5,三星G9006v (Galaxy S5 联通4G)一键ROOT教程,看教程秒懂ROOT...
- i3 10100和i5 10400的区别
- 怎样用计算机打出歌,计算器怎么调成音乐键
- Android-Studio与Python环境配置
- android studio 工作区间背景颜色设置眼睛保护色
热门文章
- 个人域名和企业域名的区别
- opencv中批量读取图片并保存
- composer global require fxp/composer-asset-plugin:1.0.0的Not enough arguments解决
- 5G学习:5G基础概念
- Shinobi开源监控项目安装
- 使用Excel画 loss_log.txt 损失函数曲线 | 简记
- json批量转换成label图像
- Web前端大作业、基于HTML+CSS+JavaScript响应式个人相册博客网站
- fMRI技术指南总结
- hadoop3.X 和 Hadoop 2.X的web端口号访问