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

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

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

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

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

JavaStruct

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

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

Javolution

http://javolution.org/

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


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


  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
Java 通过 UDP 接收 C 语言结构体数组的数据的过程可以分成两个部分,分别是在 C 程序中发送数据和在 Java 程序中接收数据。 在 C 程序中,需要将结构体数组转换成字节流,并通过 UDP 协议发送出去。具体步骤如下: 1. 定义结构体类型,并创建结构体数组: ```c typedef struct { int id; char name[20]; float score; } Student; Student students[3] = {{1, "Tom", 90.5}, {2, "Jerry", 80.5}, {3, "Lucy", 85.0}}; ``` 2. 将结构体数组转换成字节流: ```c char buffer[sizeof(Student) * 3]; memcpy(buffer, students, sizeof(Student) * 3); ``` 3. 创建 UDP 套接字,将字节流发送出去: ```c int sockfd; struct sockaddr_in serveraddr; sockfd = socket(AF_INET, SOCK_DGRAM, 0); bzero(&serveraddr, sizeof(serveraddr)); serveraddr.sin_family = AF_INET; serveraddr.sin_port = htons(PORT); serveraddr.sin_addr.s_addr = inet_addr(IP); sendto(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&serveraddr, sizeof(serveraddr)); ``` 在 Java 程序中,需要接收 UDP 数据包并将字节流转换成结构体数组。具体步骤如下: 1. 创建 DatagramSocket 对象,指定接收端口号: ```java DatagramSocket socket = new DatagramSocket(PORT); ``` 2. 创建 DatagramPacket 对象,用于接收数据包: ```java byte[] buffer = new byte[sizeof(Student) * 3]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); ``` 3. 接收数据包: ```java socket.receive(packet); ``` 4. 将字节流转换成结构体数组: ```java Student[] students = new Student[3]; for (int i = 0; i < 3; i++) { byte[] data = Arrays.copyOfRange(buffer, i * sizeof(Student), (i + 1) * sizeof(Student)); ByteBuffer byteBuffer = ByteBuffer.wrap(data); students[i] = new Student(byteBuffer.getInt(), new String(byteBuffer.array(), 4, 20), byteBuffer.getFloat()); } ``` 其中,ByteBuffer 类可以方便地将字节流转换成各种数据类型。由于 C 语言中的 char 类型是占用 1 个字节的,而 Java 中的 char 类型是占用 2 个字节的,因此需要将字节流中的 char 类型转换成 String 类型。在这里,我们使用了 String 的构造函数,指定了从字节数组第 4 个位置开始读取 20 个字节,以获取 C 语言中的字符串。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值