和C/C++不同,Java中没有结构体,联合体。这是Java作为高级语言的进步,但也使得它在进行网络字节流封送上显得捉襟见肘。

这里所指的是在进行网络编程,串口编程等需要和某些C语言中结构体形式定义的协议接口进行通讯时,Java由于缺乏结构体和字节数组之间的有效转换方法,所带来的编程上的困境。

按照通常的想法,我们需要自己去手动的一个字节,一个字节的拼凑,来实现C语言中结构体定义的数据包。在面对大量接口的时候,这样做显然绝非是可行的办法。造成这个问题的根本原因是,指针这一对内存在字节量级操作的语法特性在Java当中是不成立的。其结果就是在C语言里面通过填充结构体来完成的字节流封送编程变得复杂。

既然这是一个相当普遍的问题,那么一定是有先人尝试去解决过的。事实上却是是这样,通过一番努力,终于发现了JavaStruct和Javolution现成的两个解决方案。我们不妨拿来为我所用。

JavaStruct

http://code.google.com/p/javastruct/wiki/HowToUseJavaStruct

这个实现比较轻量级,POPO的方式,还不支持联合体,但是联合体的问题,在编程中一般是可以避开的。

Javolution

http://javolution.org/

这个类库比较庞大,对结构体和联合体都有支持。

更详细的操作细节,可以参考以上两个链接中给出的内容。有了它们,数据封送在Java中也变得简单起来了,不妨试一下吧。

Java实现结构体,让字节流封送简单起来相关推荐

  1. c 结构体转byte_C中结构体和字节流的互换及内存对齐

    mystruct p; char buff[50]; memcpy(buff,&p,sizeof(p)); //把p的内容以字节形式拷贝到buff中 mystruct* q; q = (mys ...

  2. java jni 结构体_JNI基础 -- C++基础知识(结构体共用体 )

    结构体 类似于Java中的Bean对象,可以将一些变量封装为一个结构体 声明结构体的关键字是struct,也可以通过typedef别名定义 举个栗子: struct Student { //不同的数据 ...

  3. java中结构体入参_JNA中自定义结构体如何传参?

    1.先给出C的头文件里的结构体: typedef struct DetectionZone { Zone zone; DetectionZoneParam param; } DetectionZone ...

  4. java jni 结构体_JAVA 的JNI,传参为结构体问题: 我在网上找的资料://返回一个结构 public native DiskInfo getStruct();...

    Java代码:classDiskInfo{//名字publicStringname;//序列号publicintserial;}//返回一个结构publicnativeDiskInfogetStruc ...

  5. 一步一步实现一个Java树形结构体方法

    废话不多说 ,实现一个树型结构体首先得需要一个对象来装载需要的结构数据: // idprivate Integer id;// 节点名称private String name;// 选中状态priva ...

  6. C语言--结构体与内存对齐准则简单理解

    平时基本不涉及这个问题,被问起才发现没那么简单... 一,结构体:内存中所有类型字节之和 #include<stdio.h> struct icd {int a;char b;double ...

  7. java map 结构体_业务代码的救星——Java 对象转换框架 MapStruct 妙用

    简介 在业务项目的开发中,我们经常需要将 Java 对象进行转换,比如从将外部微服务得到的对象转换为本域的业务对象 domain object,将 domain object 转为数据持久层的 dat ...

  8. java 类似结构体_Java中如何实现类似C++结构体的二级排序

    1:实现Comparable接口 import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; ...

  9. 托管代码C#调用非托管C++ API, 封送嵌套结构体数组

    一.前言: 最近这两天由于项目需要,提供给客户的C++ 动态库需要返回自定义结构体数组,网上也查了很多资料, 推荐一本书, <精通.NET互操作:P/Invoke.C++ Interop和COM ...

最新文章

  1. Android 开源框架Universal-Image-Loader全然解析(一)--- 基本介绍及使用
  2. oracle数据库gold,Oracle数据库之Oracle GoldenGate 12.2.0.1 安装、升级和删除
  3. oracle 抽样_深入理解Oracle动态采样
  4. Android官方开发文档Training系列课程中文版:布局性能优化之ListView的优化
  5. no route to host什么意思_Day 74:Vue里的route和router
  6. Kali Linux 从入门到精通(八)-主动信息收集
  7. Spring Boot: 加密应用配置文件敏感信息
  8. OpenSSL is not properly installed on your system.
  9. Mercurial:Hg缓存更改的文件和打patch
  10. oracle 怎么重启数据库,oracle数据库重启
  11. SSD的TRIM原理及实践
  12. 寒风里的凌厉香气,令人沉醉的男士魅力
  13. vagrant up 失败的原因之一
  14. 考研数一英语二计算机,考研常识 | 我是考英语一还是英语二?数一二三都有什么区别...
  15. 网站源码 HTML和源代码有什么区别?他俩是什么关系?
  16. 九世轮回篇电子计算机乐谱,mc九局九世轮回篇的歌词
  17. DHCPV4 VS DHCPV6
  18. JAVA代理模式与动态代理模式
  19. APP推广可以耍流氓?这些APP黑科技确实很流氓!
  20. 51单片机的分贝检测仪设计

热门文章

  1. Google Pixel 2(XL)录像画质提升背后
  2. linux 服务器之查看磁盘使用情况
  3. 直播协议HTTP-FLV标准解读与技术实现
  4. Nginx RTMP 功能研究
  5. http和socket之长连接和短连接区别
  6. TensorLayer的安装
  7. go 关闭通道的必要性
  8. 分享实用监控脚本:使用Shell检查进程是否存在
  9. maven环境下,控制台中文乱码
  10. leetcode 198. 打家劫舍(最简单的动态规划问题)