我一直用c/c++,想问一下如果想做一个解析网络数据包的程序,要实现以下功能该怎么做:
比方从网络收下来一些数据,放到一个byte数组中,现在要解析这个数组,如果根据包格式,数据中第一个字段应该是一个4字节的内容比如int,如何得到这个int。
在c/c++中可以这样做:
char* theArray; //假如这是收到的数组
int a=*(int*)&theArray[0];
比方从网络收下来一些数据,放到一个byte数组中,现在要解析这个数组,如果根据包格式,数据中第一个字段应该是一个4字节的内容比如int,如何得到这个int。
在c/c++中可以这样做:
char* theArray; //假如这是收到的数组
int a=*(int*)&theArray[0];
我举一个例子吧,我们项目中的一个方法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;
}
int应该是读四个。
用JAVA也很简单且方便啦:
DataInputStream dis=new DataInputStream(new ByteArrayInputSream(你的那个byte数组));若你要读int,就用 dis.readInt();
若你要读long,就用 dis.readLong();
依次往下读取就行了。
如果我想实现把一个数组转换成一个C++中结构体这种功能呢?
比如:
struct MyStruct
{
int member1;
long member2;
...
...
}char* theArray; //假如是收到的数组
MyStruct* p=(MyStruct*)&theArray[0];
int a=p->member1;
...
若真是这样,楼主你就犯大错误了
显然楼主不明白:在网络上是如何传输像struct之类带有结构的数据的。若像楼主这样写写代码传输,会出问题的(做法不正规)
那如何传输呢?一言两语说不清。方法也多。不是卖关子(不是的),而是要说清,确实要打不少字,我打字不快,也怕打字。楼主先问有经验的师兄吧,写过网络程序的人都知道。
char* theArray; //假如这是收到的数组
int a=*(int*)&theArray[0];
通常在网络协议的中数据是高位在前、低位在后的顺序,这和java是一致的,但C/C++里通常是相反的顺序(也不一定)。因此C/C++的socket库函数里会有ntoh?/hton这样的函数用于转换网络传输数据和本机数据。例如long a = (ntol)*(long*)&theArray[0];另外,在C/C++里int是不定长的,不能直接用于网络传输。
可能我平时写的程序,服务器端和客户端都是自己用VC写的,要么就是像HTTP协议头一样是纯文本的,所以没有重视协议的通用性问题,谢谢。
群组地址:http://www.rjgc.net/uchome/space.php?do=mtag&tagid=73