java接收c语言的结构体

java接收c语言的结构体

DataInputStream inputStream = new DataInputStream(s.getInputStream());
int read = 0;
if (inputStream != null) {
  read = inputStream.read(buf);
}
if (read == -1) {
  break;
}
System.out.println(new String(buf,0,read));
结果,取到的字母是对的,数字不对(乱码),请问如何解决
 
java和C通信,数据传输要自己解析
在C端,很可能就是直接把结构体转成char*指针发送的(或者用char[]数组memcpy以后发送的),所以java端得到的字符数据是正常的,因为都是占用一个byte,而数字数据,占用多个byte,这样,把多个byte转成String肯定就被解析为unicode编码的字符而乱码(因为系统并不知道你的多个byte到底是数字类型的数据还是多字节字符的编码),所以就需要自己针对这样的字节解析
正确的做法,应该是字节了解通信结构体的长度,然后接收的时候解析
比如,C的结构体,第一个数据成员是char[2],第二个是int,等等,那么java端接收
DataInputStream inputStream = new DataInputStream(s.getInputStream());
int read = 0;
byte[] first = new byte[2];
read = inputStream.read(first);
int second = inputStream.readInt(); //可以这样读入,否则,
                                         //读入byte数组后自己把4位byte数组信息转成int
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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 语言中的字符串。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值