JAVA没有结构体,我用基于HashMap的一个类来实现

来源:互联网 发布:python爬虫 编辑:程序博客网 时间:2024/04/29 01:21

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,西安国咨软件。如要引用请注明出处。



阅读全文
0 0
原创粉丝点击