大家知道,java是没有结构体的,而java中是用类保存属性
这时会出现一个问题,如果我们开发的程序客户端用的是java语言(比如android程序),而服务器是用c语言开发
那么如何将java中的属性跟c语言中的结构体进行转化呢
其实实现方法也比较简单:就是讲他们通过变成byte[]数组进行转化
举例说明(此处只写了将java中的字段转化为byte[]数组进行网络传输,服务器就收byte[]数据即可,同理服务器也只要将数据转化为byte[]数组,客户端接受后解析即可)
class Employee {
//此处我们将byte数据大小定死,为了方便,我们可以根据具体情况设计
private byte[] buf = new byte[30];
//将int转为低字节在前,高字节在后的byte数组,因为c中的Int类型和java中类型存储方法不同
//一个低字节在前,一个低字节在后
private static byte[] toLH(int n) {
byte[] b = new byte[4];
b[0] = (byte) (n & 0xff);
b[1] = (byte) (n >> 8 & 0xff);
b[2] = (byte) (n >> 16 & 0xff);
b[3] = (byte) (n >> 24 & 0xff);
return b;
}
//将float转为低字节在前,高字节在后的byte数组
private static byte[] toLH(float f) {
return toLH(Float.floatToRawIntBits(f));
}
//此处将name,id,salary三个字段分别为string,int,float类型转化到byte[]数组中
public Employee(String name, int id, float salary) {
//String类型根据getBytes确定长度,此处我输入的数据占20个字节,所以后面数据从byte[20]开始
byte[] temp = name.getBytes();
System.arraycopy(temp, 0, buf, 0, temp.length);
//java中int占四个字节
temp = toLH(id);
System.arraycopy(temp, 0, buf, 20, temp.length);
//float也根据自己转化成byte后length方法获取长度
temp = toLH(salary);
System.arraycopy(temp, 0, buf, 24, temp.length);
}
//返回要发送的数组
public byte[] getBuf() {
return buf;
}
//发送数据给服务器测试
public static void main(String[] args) {
try {
//因为服务器是本机,所以地址为172.0.0.1
Socket sock = new Socket("127.0.0.1", 8888);
sock.getOutputStream().write(new Employee("jfaskldf", 12413234, 4232.112f).getBuf());
sock.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}