如何用Java读取网络流数据(协议包)

时间:2011-07-12 10:38:07

标签: java networking networkstream

正致力于解码某个gps设备用于通信的协议。 现在,我正在分析它发送的第一个数据包。我能够阅读它,但我想我没有正确阅读它。

这是我到目前为止所得到的:

    public static String toHex(byte[] bytes) {
    BigInteger bi = new BigInteger(1, bytes);
    return String.format("%0" + (bytes.length << 1) + "X", bi);
}

private void ProcessInitialPacket(){
            int port = 1954;
    System.out.println("Listening on port :"+port);
    byte[] data =  new byte[17];
    byte[] ackPacket = new byte[2];
    byte[] dataPacket= new byte[15];
    try {
        ServerSocket sSocket = new ServerSocket(port);
        Socket cSocket = sSocket.accept();          
        DataInputStream dataIN = new DataInputStream(cSocket.getInputStream());
        int packetSize=dataIN.read(data,0,data.length);         
        System.arraycopy(data, 0, ackPacket, 0, 2);
        System.arraycopy(data,2,dataPacket,0,15);

        System.out.println("Total packet size: "+ packetSize);
        System.out.println("ACK PACKET : "+ toHex(ackPacket));
        System.out.println("DATA PACKET: "+ toHex(dataPacket));
        System.out.println("FULL PACKET: "+ toHex(data));
    } catch (IOException e) { 
        e.printStackTrace();
    }
}

输出:

-PARSER()--

-INITSESSION-- 聆听港口:1954年

总包大小:17

ACK PACKET:000F

DATA PACKET:333532383438303236323631393534

FULL PACKET:000F333532383438303236323631393534

------ CLOSESESSION ------------

现在,我的问题:

这里发生的是设备发送[0x00] [0x0F] xxxxxxxxxxxxxxx 其中xxxxxxx是其imei(数据包)。 我的问题是数据包上有太多的3,所以真正有效的输出是

352848026261954

你通过删除3获得的

。我的问题是:这种行为可以来自我的代码或协议的一部分吗?我可以通过编程方式纠正此问题,但我想知道它有一种代码可以导致这些额外3的方法。

2 个答案:

答案 0 :(得分:3)

您正在查看ascii值的十六进制值,需要将其解码为数字。字符“0”作为十进制是48或十六进制0x30,直到'9'是十进制的57或十六进制的0x39。

所以是一个字节序列

33 35 32 38 34 38 30 32 36 32 36 31 39 35 34

"352848026261954"

为ASCII字符。

我会改变你的代码

dataIN.readFully(data); // always read 17 bytes, not less
String text = new String(data, 0, 2, 13); // decodes 8-bit bytes as a String
long number = Long.parseLong(text);

答案 1 :(得分:2)

这是ASCII数字编码。 0发送为'0',即0x30。 1被发送为0x31。等等。所以你对数据格式的理解是不正确的。