如果我从网络上收到了一个字节流
我想按照一定的协议分析它 怎么做? 
即,假设现在待分析的字节流在byte[] data里,其头一个字节代表版本,接着三个字节代表号,     
再后面的两个字节是名称
    我需要把版本号,序列号,名称分别读取出来!
我现在能找到的可行方式就是先把它存到一个文件里 然后再读出来分析
不过个人亦认为这种方式太弱
不知道能不能象C里面一样直接从内存里拷贝指定字节数出来分析?(memcpy)
哪个类有特定的方法可以读取指定字节出来啊?
请高手指教!我已经找了一下午的jdk文档了,还是不明白 -_-

解决方案 »

  1.   

    没有人来回这个弱弱的贴 ...
    想明白了,其实用io包里的api可以直接获取
    不管用哪个类,只要他的read方法有参数可以控制读取字节就可以了
    基本上,每个类都有此方法
      

  2.   

    楼主的想法是对的,
    比如一个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];//得到号
    ....
      

  3.   

    楼上这位的方法也是可行的 
    不过如果 int verison = dis.read(number, 0, 3);
    不就可以了?
    为什么要一个一个收,再移位呢?
    是不是有什么特殊的含义?另外,我现在又遇到了一个问题,
    现在是要制作包(收完了总要回啊,赫赫)
    假设头10个字节都是int类型,分别是0~9;
    后面的字节填充的是字符串“helloworld”
    因为发包的时候必须要转换为byte[]
    如果我一个字节一个字节的写,当然可以,不过个人感觉不该用这么弱的方式
    有没有比较好的解决办法?请赐教!
      

  4.   

    你可以做一个对socket的InputStream的处理的类,比如叫做SocketStream.
    其中包括几个方法:
    /**
     * 读取一个字节
     */
    byte   receive();/**
     * short取出两个字节组成short类型
     */
    short  receive(short); /**
     * short取出四个字节组成int类型
     */
    int    receive();/**
     * 取出指定字节数的数组
     */
    byte[] receive(int size);
    ........