Java结构体: JavaStruct (实现类似C的结构体或python的struct.pack效果)

JavaStruct是一个第三方库,可在Java中实现类似C/C++结构体的功能。适用于Java或Android应用程序与嵌入式设备通讯时自定义协议格式的需求,简化字节流处理。相比Java序列化,JavaStruct能提供更高效的数据序列化。

Javastruct 是什么

简而言之,Javastruct 是一个第三方库,用于像处理 C 或者 C++ 结构体那样处理 java 对象。也即利用 Javastruct 可以在 java 上实现类似于结构体的功能和操作。

Javastruct 的用途

在 java 或者 Android 应用程序与一些嵌入式设备通讯或者C、C++ 应用程序通讯时,比如网络、无线、蓝牙、串口通讯等场景,由于实际传输时我们希望在通讯时使用自定义的协议格式,这样就必须进行字节流的处理。比如:协议格式为:“包头 + 命令码 + 长度 + 数据 + 校验 + 包尾“ 这种格式,使用 java 默认的方法就需要每条协议设置或解析每个 byte,十分繁琐。这时,会很怀念 C 语言的结构体和指针,这回极大节省我们的代码逻辑和工作量。这就是我要使用并介绍 JavaStruct 的原因了。除此之外,该库还可以用作一个简单但空间利用高效的序列化方法。

JavaStruct 库支持原语、数组、C字符串及嵌套类等。同时支持大端和小端字节序。 Javastruct 也可以使用 ArrayLengthMarker 注释来处理其他域中定义长度的域。 在后面的例程和文档中会逐步涉及到。

Javastruct 的性能

对于简单的类,JavaStruct 要比 Java 序列化更快速,对于复杂和嵌套的类,通常与 Java 序列化性能相同。通常 JavaStruct 产生小2到3倍的输出结果。

JavaStruct 未来工作

1. 更好的命名和统一的外观类

2. 详细的文档

3. 基于 ByteBuffer 的结构体序列化(目前是基于stream流的方式)

4. 更好的性能

5. 更多单元测试

6. 数据对齐支持

7. 位域

8. Union 联合体

运行条件

任何具有 Java 5 或者更高的 JVM 的系统

其他类似项目

 Javolution 也有很好的结构体实现,Javolution 结构体使用特殊类来表示域,JavaStruct 有不同途径并且使用 POJO 和 Java 5 注释。


关于 JavaStruct 应用的文章系列,可以移步至如下链接:

1. 《Java 结构体之 JavaStruct 使用教程<一> 初识 JavaStruct

2. 《Java 结构体之 JavaStruct 使用教程<二> JavaStruct 用例分析

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

转载自:http://blog.youkuaiyun.com/jazzsoldier/article/details/75570462#comments

### struct.packstruct.unpack 的使用方法及区别 `struct.pack` 和 `struct.unpack` 是 Python `struct` 模块中的两个核心函数,它们分别用于将 Python 数据类型与二进制数据之间进行转换。两者之间的功能是互逆的,适用于底层数据处理、网络通信和文件格式解析等场景。 #### struct.pack 的使用方法 `struct.pack(fmt, v1, v2, ...)` 函数用于将给定的变量按照指定的格式 `fmt` 打包成二进制数据(字节串)。格式字符串 `fmt` 包含格式字符和可选的字节顺序、大小和对齐方式的标识符。例如,`'h'` 表示短整型(2字节),`'i'` 表示整型(4字节),`'B'` 表示无符号字节(1字节)等。格式字符串前可以包含一个字节顺序标识符,如 `'>'` 表示大端模式,`'<'` 表示小端模式。 示例代码如下: ```python import struct # 使用大端模式打包两个整数和两个字节 data = struct.pack(">iiBB", 20, 400, 0x0D, 0x0A) print(data) # 输出: b'\x00\x00\x00\x14\x00\x00\x01\x90\r\n' ``` #### struct.unpack 的使用方法 `struct.unpack(fmt, string)` 函数用于将二进制数据按照指定的格式 `fmt` 解包为 Python 数据类型。该函数返回一个元组,其中包含解包后的数据。格式字符串 `fmt` 必须与打包时使用的格式一致,否则可能导致解包错误数据不一致。 示例代码如下: ```python import struct # 解包之前打包的数据 unpacked_data = struct.unpack(">iiBB", data) print(unpacked_data) # 输出: (20, 400, 13, 10) ``` #### struct.packstruct.unpack 的区别 `struct.pack` 和 `struct.unpack` 的主要区别在于它们的功能方向不同。`struct.pack` 将 Python 数据转换为二进制数据,而 `struct.unpack` 则将二进制数据还原为 Python 数据。它们通常用于处理需要精确控制字节顺序和大小的场景,例如网络协议数据的编码和解码。 此外,`struct.pack` 和 `struct.unpack` 与字符串的 `encode` 和 `decode` 方法不同。后者用于在文本数据和字节流之间进行转换,而前者用于在二进制数据和 Python 数据类型之间进行转换。这种区别使得 `struct` 模块更适合处理结构化的二进制数据,如 C 语言中的结构体。 #### 格式字符串的规则 格式字符串由格式字符、数量前缀和字节顺序标识符组成。格式字符定义了数据类型,如 `'i'` 表示整型,`'s'` 表示字符串,`'B'` 表示无符号字节等。数量前缀表示重复的次数,例如 `'4s'` 表示长度为 4 的字符串。字节顺序标识符定义了数据的存储方式,如 `'>'` 表示大端模式,`'<'` 表示小端模式。 #### 注意事项 - 格式字符串中的每个格式字符对应一个数据项,数据项的数量必须与格式字符串中定义的数量一致。 - 如果格式字符串中包含字符串类型(如 `'s'`),则需要确保字符串的长度与格式字符串中指定的长度一致。 - `struct.pack` 和 `struct.unpack` 支持的数据类型有限,主要适用于数值类型和固定长度的字符串。 - 字节顺序标识符可以改变数据的存储方式,但默认情况下,`struct` 模块根据本地机器的字节顺序进行转换。 --- ### 示例代码 ```python import struct # 打包数据 data = struct.pack(">iiBB", 20, 400, 0x0D, 0x0A) print(data) # 输出: b'\x00\x00\x00\x14\x00\x00\x01\x90\r\n' # 解包数据 unpacked_data = struct.unpack(">iiBB", data) print(unpacked_data) # 输出: (20, 400, 13, 10) ``` --- ### 相关问题 1. 如何使用 struct 模块处理 C 语言结构体? 2. 如何在 Python 中使用 struct 模块解析网络协议数据? 3. struct.packstruct.unpack 如何处理浮点数? 4. 如何使用 struct 模块处理变长字符串?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值