如果我从网络上收到了一个字节流
我想按照一定的协议分析它 怎么做?
即,假设现在待分析的字节流在byte[] data里,其头一个字节代表版本,接着三个字节代表号,
再后面的两个字节是名称
我需要把版本号,序列号,名称分别读取出来!
我现在能找到的可行方式就是先把它存到一个文件里 然后再读出来分析
不过个人亦认为这种方式太弱
不知道能不能象C里面一样直接从内存里拷贝指定字节数出来分析?(memcpy)
哪个类有特定的方法可以读取指定字节出来啊?
请高手指教!我已经找了一下午的jdk文档了,还是不明白 -_-
我想按照一定的协议分析它 怎么做?
即,假设现在待分析的字节流在byte[] data里,其头一个字节代表版本,接着三个字节代表号,
再后面的两个字节是名称
我需要把版本号,序列号,名称分别读取出来!
我现在能找到的可行方式就是先把它存到一个文件里 然后再读出来分析
不过个人亦认为这种方式太弱
不知道能不能象C里面一样直接从内存里拷贝指定字节数出来分析?(memcpy)
哪个类有特定的方法可以读取指定字节出来啊?
请高手指教!我已经找了一下午的jdk文档了,还是不明白 -_-
想明白了,其实用io包里的api可以直接获取
不管用哪个类,只要他的read方法有参数可以控制读取字节就可以了
基本上,每个类都有此方法
比如一个InputStream is 就是从网上得到的流
那么可以使用如下方法:
DataInputStream dis=new DataInputStream(is);
int version=dis.read();//得到版本
int[] number=new int[3];
number[0]=dis.read();
number[1]=dis.read();
number[2]=dis.read();
int realNum=(number[0]<<16) +(number[1]<<8)+number[2];//得到号
....
不过如果 int verison = dis.read(number, 0, 3);
不就可以了?
为什么要一个一个收,再移位呢?
是不是有什么特殊的含义?另外,我现在又遇到了一个问题,
现在是要制作包(收完了总要回啊,赫赫)
假设头10个字节都是int类型,分别是0~9;
后面的字节填充的是字符串“helloworld”
因为发包的时候必须要转换为byte[]
如果我一个字节一个字节的写,当然可以,不过个人感觉不该用这么弱的方式
有没有比较好的解决办法?请赐教!
其中包括几个方法:
/**
* 读取一个字节
*/
byte receive();/**
* short取出两个字节组成short类型
*/
short receive(short); /**
* short取出四个字节组成int类型
*/
int receive();/**
* 取出指定字节数的数组
*/
byte[] receive(int size);
........