遇到一个Java Socket二进制数据包解析的问题,希望大家能不吝赐教。情况是我们需要解析客户端通过socket发来的二进制数据包。数据包有固定的格式,需要按固定字节长度去取字段。
现在遇到的问题是不知道如何将接收到的数据的byte[]转换成int、double、string或是date等类型。
不知道大家有没有相关的例子或是文档可以参考?

解决方案 »

  1.   

    http://bbs.csdn.net/topics/390298088
    80分算法题
      

  2.   

    既然你知道字节的长度那就直接生成byte字节数组 取值就可以了
      

  3.   

    //byteToString
    public static String byte2String(byte buf[], int offset)
        {
            int pos = offset;
            for(; offset < buf.length; offset++)
                if(buf[offset] == 0)
                    break;        if(offset > pos)
                offset--;
            else
            if(offset == pos)
                return "";
            int len = (offset - pos) + 1;
            byte bb[] = new byte[len];
            System.arraycopy(buf, pos, bb, 0, len);
            String str = new String(bb);
            return str;
        }
    //byteToLong
    public static long byte2long(byte b[])
        {
            return (long)b[7] & 255L | ((long)b[6] & 255L) << 8 | ((long)b[5] & 255L) << 16 | ((long)b[4] & 255L) << 24 | ((long)b[3] & 255L) << 32 | ((long)b[2] & 255L) << 40 | ((long)b[1] & 255L) << 48 | (long)b[0] << 56;
        }
    //byteToInt
    public static int byte2int(byte b[], int offset)
        {
            return b[offset + 3] & 0xff | (b[offset + 2] & 0xff) << 8 | (b[offset + 1] & 0xff) << 16 | (b[offset] & 0xff) << 24;
        }
      

  4.   

    按照给定的协议,截取字段,根据字节流里面的值来“翻译”。举个列子/**
     * 将高字节数组转换为int
     * 
     * @param b
     *            byte[]
     * @return int
     */
    public static int hBytesToInt(byte[] b) {
    int s = 0;
    for (int i = 0; i < 3; i++) {
    if (b[i] >= 0) {
    s = s + b[i];
    } else {
    s = s + 256 + b[i];
    }
    s = s * 256;
    }
    if (b[3] >= 0) {
    s = s + b[3];
    } else {
    s = s + 256 + b[3];
    }
    return s;
    } /**
     * 将低字节数组转换为int
     * 
     * @param b
     *            byte[]
     * @return int
     */
    public static int lBytesToInt(byte[] b) {
    int s = 0;
    for (int i = 0; i < 3; i++) {
    if (b[3 - i] >= 0) {
    s = s + b[3 - i];
    } else {
    s = s + 256 + b[3 - i];
    }
    s = s * 256;
    }
    if (b[0] >= 0) {
    s = s + b[0];
    } else {
    s = s + 256 + b[0];
    }
    return s;
    }
    方法很多网上一搜一大堆,传入byte流返回相应的数字等等,字符串需要知道编码格式。
      

  5.   

    最好在协议里面加上数据类型标示,然后在根据byte转换