原文链接

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 - 通讯协议的解封包第三方库--(二)官方文档二相关推荐

  1. javaStruct - 通讯协议的解封包第三方库--(二)官方文档一

    原文链接 https://code.google.com/archive/p/javastruct/ 翻译用工具 翻译使用的是个人免费版Transmate 译文 javastruct 一个将java对 ...

  2. javaStruct - 通讯协议的解封包第三方库--(二)官方文档三

    原文链接 https://code.google.com/archive/p/javastruct/wikis/example_photoshop_acb_file_reader_writer.wik ...

  3. python数据科学和机器学习常用库的官方文档

    文章目录 Matplotlib Numpy Pandas sklearn sklearn_crfsuite SciPy Matplotlib 进入matplotlib官网地址:https://matp ...

  4. python 笔记 :Gym库 (官方文档笔记)

    Gym是一个开发和比较强化学习算法的工具箱.它不依赖强化学习算法结构,并且可以使用很多方法对它进行调用. 1 Gym环境 这是一个让某种小游戏运行的简单例子. 这将运行 CartPole-v0 环境实 ...

  5. 【清单】语言、框架及库的官方文档、examples、tutorials

    spark:Quick Start tensorflow: 官方文档中文版:介绍 | TensorFlow 官方文档中文版 tutorials:Get Started with TensorFlow

  6. Poco 库开发-教你如何读Poco的官方文档

    引言 在使用任何一种框架开发的时候,都不免要阅读官方的文档. 下面就讲述如何来读Poco库的官方文档 Poco库 在我们下载好Poco 后,会有两个文件夹,一个是放文档的doc,另外一个就是代码了,这 ...

  7. 如何快速一次性卸载所有python包(第三方库)呢

    这篇文章主要介绍了如何快速一次性卸载所有python包(第三方库)呢,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 很多时候我们 ...

  8. 官方文档链接(Core Graphics、View Controller、UICollectionView、UITableView、第三方库)

    Core Graphics Quartz 2D Programming Guide Core Graphics (Framework) Drawing(UIKit).Images and PDF(UI ...

  9. 模块开发之React使用第三方库PropTypes属性限制(十二)

    模块开发之React使用第三方库PropTypes属性限制(十二) 前言 这是一个纯配置的第三方库模块,所以我们需要掌握知识不需要太详细.能知道并拿来即用即可. 下面以使用该模块的背景展开,然后介绍使 ...

最新文章

  1. attiny13a程序实例_ATtiny13A带A新版本
  2. 何以为「我来」?全方位解读笔记新秀高速增长
  3. 急速收藏:4套iOS SDK的H5打通方案
  4. 团队作业4——第一次项目冲刺(Alpha版本)3rd day
  5. DMDW集群配置到DEM
  6. 模拟RabbitMQ网络分区
  7. 得到classpath和当前类的绝对路径的一些方法
  8. android 解析错误 真机,AndroidStudio使用真机调试时出的一些bug
  9. 信息安全工程师笔记-综合知识冲刺(一)
  10. 面试题:二叉树中和为某一路径
  11. java开发者工具开源版_开源工具如何帮助飓风受害者
  12. fiddler实现后端接口 mock(不需要修改开发代码)
  13. 3D博物馆虚拟纪念馆数字博览厅的“另类”展现方式
  14. Linux查看文件大小的命令du的简单介绍
  15. Docker - 相较于虚拟机的优势,以及为什么要使用docker
  16. android authority root galaxy s5,三星G9006v (Galaxy S5 联通4G)一键ROOT教程,看教程秒懂ROOT...
  17. i3 10100和i5 10400的区别
  18. 怎样用计算机打出歌,计算器怎么调成音乐键
  19. Android-Studio与Python环境配置
  20. android studio 工作区间背景颜色设置眼睛保护色

热门文章

  1. 个人域名和企业域名的区别
  2. opencv中批量读取图片并保存
  3. composer global require fxp/composer-asset-plugin:1.0.0的Not enough arguments解决
  4. 5G学习:5G基础概念
  5. Shinobi开源监控项目安装
  6. 使用Excel画 loss_log.txt 损失函数曲线 | 简记
  7. json批量转换成label图像
  8. Web前端大作业、基于HTML+CSS+JavaScript响应式个人相册博客网站
  9. fMRI技术指南总结
  10. hadoop3.X 和 Hadoop 2.X的web端口号访问