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端接收
在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