当前位置:编程学习 > JAVA >>

Java Socket二进制数据包解析的问题

遇到一个Java Socket二进制数据包解析的问题,希望大家能不吝赐教。

情况是我们需要解析客户端通过socket发来的二进制数据包。数据包有固定的格式,需要按固定字节长度去取字段。
现在遇到的问题是不知道如何将接收到的数据的byte[]转换成int、double、string或是date等类型。
不知道大家有没有相关的例子或是文档可以参考?
--------------------编程问答-------------------- 1、晕,你不是说了吗,“数据包有固定的格式”,这个格式里包括对应的类型及具体编码等信息。(如果没有,你要让提供者提供)
2、这个就相当是一个“协议”,压包和解包都得根据协议要求来。
3、别人有的也是另外一个协议,跟你的不一定一样。 --------------------编程问答-------------------- api文档。。。 --------------------编程问答-------------------- 用DataOutputStream --------------------编程问答--------------------
引用 3 楼 alison007 的回复:
用DataOutputStream

要约定一个协议 --------------------编程问答-------------------- http://bbs.csdn.net/topics/390298088
80分算法题 --------------------编程问答-------------------- 既然你知道字节的长度那就直接生成byte字节数组 取值就可以了 --------------------编程问答-------------------- //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;
    } --------------------编程问答-------------------- 按照给定的协议,截取字段,根据字节流里面的值来“翻译”。举个列子

/**
 * 将高字节数组转换为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流返回相应的数字等等,字符串需要知道编码格式。 --------------------编程问答-------------------- 最好在协议里面加上数据类型标示,然后在根据byte转换 --------------------编程问答-------------------- 你不是已经知道包的格式了吗,按照格式解析不是得啦!
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,