0

正在解码某个 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

确认包:000F

数据包:333532383438303236323631393534

全包:000F333532383438303236323631393534

------闭幕------------

现在,我的问题:

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

352848026261954

您可以通过删除 3's 获得。我的问题是:这种行为是否来自我的代码或其协议的一部分?我可以以编程方式更正此问题,但我想知道代码是否有办法导致这些额外的 3 秒。

4

2 回答 2

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);
于 2011-07-12T10:50:47.920 回答
2

这是 ASCII 数字编码。0 被传输为“0”,即 0x30。1 作为 0x31 传输。等等所以你对数据格式的理解是不正确的。

于 2011-07-12T10:48:00.113 回答