正致力于解码某个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的方法。
答案 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。等等。所以你对数据格式的理解是不正确的。