JAVA没有机构体,有时候会觉得很不方便,尤其是在进行网络通信时,如果数据包都用字符串,程序的可读性和可升级性都会变得很差。
下面是我在用JAVA实现TCP通信时的实现方法。
/*
JAVA没有结构体,我用基于HashMap的一个类来实现:
这个类,实现了二个方法:
1、pack:将HashMap中一个一个的字符串,按照事先定义的宽度,编码进一个字节数组;
2、unpack:将一个字节数组,按照事先定义的宽度拆解成一个一个的字符串,保存在这个HashMap中。
每个字符串在字节数组中所占的宽度,用这个二维数组来定义:
Object[][] StructFriend={
{"ID",8},
{"IP",24},
{"port",6},
{"LocalIP",24},
{"LocalPort",6},
{"reserved1",8},
{"reserved2",8}
}
/ 对应的C语言结构体 /
struct StructFriend{
char ID[8];
char IP[24];
char port[6];
char LocalIP[24];
char LocalPort[6];
char reserved1[8];
char reserved2[8];
}
*/
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.HashMap;
/**
* Created by webliv on 2017/11/10.
* www.gooods.com
*/
public class TStruct extends HashMap {
public int getStructSize(Object[][] struct){
int size=0;
for(int i=0;i<struct.length;i++) size+= (int)struct[i][1];
return size;
}
//将hash表中的所有字符串,按照定义的顺序和大小,装入字节数组data
//data中从offset的位置开始装入,结束后返回新的offset位置
public int pack(Object[][] struct,byte[] data,int offset,String CharsetName) throws UnsupportedEncodingException{
Object v;
for (int i=0;i<struct.length;i++) {
v=get((String)struct[i][0]); //从hash表中,取得struct成员变量的值
if (v!=null) {
int n=(""+v).getBytes(CharsetName).length;
if (n>(int)struct[i][1]) n=(int)struct[i][1];
System.arraycopy((""+v).getBytes(CharsetName),0, data,offset, n);
}
offset += (int)struct[i][1];
}
return offset;
}
//将字节数组data中的数据,按照定义的顺序和大小,解码成一个一个的字符串,并装入到hash表中
//data中从offset的位置开始解码,结束后返回新的offset位置
public int unpack(Object[][] struct,byte[] data,int offset,String CharsetName) throws UnsupportedEncodingException{
clear();//清空hash
for (int i=0;i<struct.length;i++) {
put((String)struct[i][0],new String(data,offset,(int)struct[i][1],CharsetName));
offset += (int)struct[i][1];
}
return offset;
}
}
webliv,西安国咨软件。如要引用请注明出处。