我一直用c/c++,想问一下如果想做一个解析网络数据包的程序,要实现以下功能该怎么做:
比方从网络收下来一些数据,放到一个byte数组中,现在要解析这个数组,如果根据包格式,数据中第一个字段应该是一个4字节的内容比如int,如何得到这个int。
在c/c++中可以这样做:
char* theArray; //假如这是收到的数组
int a=*(int*)&theArray[0];

解决方案 »

  1.   

    如果是byte[]的话就是按位解析。我做在做的就是这样的。
    我举一个例子吧,我们项目中的一个方法static public short BytesToShort(byte[] pData,int nBegin) {
            if((nBegin + 2) <= pData.length )
                return (short)( ((pData[nBegin + 1]  & 0x000000ff) << 8) + (pData[nBegin]  & 0x000000ff) );
            return 0;
        }
      

  2.   

    要知道每个类型的长度,这里面short读两个
    int应该是读四个。
      

  3.   


    用JAVA也很简单且方便啦:
    DataInputStream  dis=new DataInputStream(new ByteArrayInputSream(你的那个byte数组));若你要读int,就用 dis.readInt();
    若你要读long,就用 dis.readLong();
    依次往下读取就行了。
      

  4.   

    1楼4楼的方法应该都可行,不过看起来4楼的更符合java的风格啦。
    如果我想实现把一个数组转换成一个C++中结构体这种功能呢?
    比如:
    struct MyStruct
    {
      int member1;
      long member2;
      ...
      ...
    }char* theArray; //假如是收到的数组
    MyStruct* p=(MyStruct*)&theArray[0];
    int a=p->member1;
    ...
      

  5.   

    你是说:对方传输的是一个struct,是把整个struct强制作为字节数组传输过来的,你收到该字节数组后,如何再转成struct?
    若真是这样,楼主你就犯大错误了
    显然楼主不明白:在网络上是如何传输像struct之类带有结构的数据的。若像楼主这样写写代码传输,会出问题的(做法不正规)
    那如何传输呢?一言两语说不清。方法也多。不是卖关子(不是的),而是要说清,确实要打不少字,我打字不快,也怕打字。楼主先问有经验的师兄吧,写过网络程序的人都知道。
      

  6.   

    如果一个网络协议可以被各种语言识别,那么是不能直接发送或接收C/C++的struct的。发送时要每个数据单独发送,接收也是如此。在java里通常是用DataInputStream解析。如果是数据块的形势,就先接收一个byte[]数组,再用DataInputStream+ByteArrayInputStream解析。在C/C++里,象楼主这样的代码也是不正确或者是不好的。
    char* theArray; //假如这是收到的数组 
    int a=*(int*)&theArray[0];
    通常在网络协议的中数据是高位在前、低位在后的顺序,这和java是一致的,但C/C++里通常是相反的顺序(也不一定)。因此C/C++的socket库函数里会有ntoh?/hton这样的函数用于转换网络传输数据和本机数据。例如long a = (ntol)*(long*)&theArray[0];另外,在C/C++里int是不定长的,不能直接用于网络传输。
      

  7.   


    可能我平时写的程序,服务器端和客户端都是自己用VC写的,要么就是像HTTP协议头一样是纯文本的,所以没有重视协议的通用性问题,谢谢。
      

  8.   

    补充一点,C/C++中,字节顺序是跟目标平台相关的,主要看是PowerPC还是x86。
      

  9.   

    我们诚恳地邀请大家加入到我们Java群组,热爱Java的同仁们,一起来探讨其中的难题和奥妙,每周我们会发出一个趣味性的小题目供大家探讨。也会继续上传JAVA连载教程,期待你们的加入! 
    群组地址:http://www.rjgc.net/uchome/space.php?do=mtag&tagid=73