[英]How to read network stream data in Java (Protocol packets)
正在解碼某個 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();
}
}
output:
-PARSER()--
-INITSESSION-- 監聽端口:1954
總包大小:17
確認包:000F
數據包:333532383438303236323631393534
全包:000F333532383438303236323631393534
------閉幕------------
現在,我的問題:
這里發生的是設備發送 [0x00][0x0F]xxxxxxxxxxxxxxx ,其中 xxxxxxx 是它的imei(數據包)。 我的問題是數據包上的 3 太多了,所以真正有效的 output 是
352848026261954
您可以通過刪除 3's 獲得。 我的問題是:這種行為是否來自我的代碼或其協議的一部分? 我可以以編程方式更正此問題,但我想知道代碼是否有辦法導致這些額外的 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);
這是 ASCII 數字編碼。 0 被傳輸為“0”,即 0x30。 1 作為 0x31 傳輸。 等等所以你對數據格式的理解是不正確的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.