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

ACK パケット : 000F

データパケット: 333532383438303236323631393534

完全なパケット: 000F333532383438303236323631393534

------閉会式------------

今、私の問題:

ここで起こっていることは、デバイスが [0x00][0x0F]xxxxxxxxxxxxxxx を送信することです。xxxxxxxx はその imi (データ パケット) です。私の問題は、データ パケットに 3 が多すぎるため、実際の有効な出力は次のようになることです。

352848026261954

これは、3 を削除することによって得られます。私の質問は、この動作は私のコードまたはプロトコルの一部に由来するのでしょうか? 私はこれをプログラムで修正できますが、コードがこれらの余分な 3 を引き起こす方法があることを知りたいです。

4

2 に答える 2

3

数値としてデコードする必要があるASCII値の16進数を見ています。10進数としての文字「0」は48または16進数の0x30であり、「9」までは10進数として57または16進数として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 に答える