2017-02-16 61 views
0

我正在構建一個工具,它從地震3引擎主服務器(在這種情況下cod2主服務器)檢索服務器列表。 這些主服務器響應包含ip端口信息的大字符串。 這裏的ip是4個字符,每個字符都應該轉換爲一個數字(1-255)。 雖然當我嘗試這個128以上的數字轉換爲這個Unicode替換字符(65533或fffd)。Java無法獲得正確的值爲瓦爾斯

我試了幾件事情:

System.out.println("ip: "+String.format("%02x", (int)r.charAt(i+1))+"."+String.format("%02x", (int)r.charAt(i+2))+"."+String.format("%02x", (int)r.charAt(i+3))+"."+String.format("%02x", (int)r.charAt(i+4))); 
System.out.println("ip: "+(int)r.charAt(i+1)+"."+(int)r.charAt(i+2)+"."+(int)r.charAt(i+3)+"."+(int)r.charAt(i+4)); 

在PHP與功能相同的字符串這一切工作:

ord(char); 

我認爲這個問題可能是我的Java使用unicode的,我認爲它應該使用ascii(或擴展ascii,不知道)。

[8N] < <這4個字符翻譯正確

ZH < <繼承人一個這是不正確的,我只是不能從我的控制檯複製正確的符號,如果我把它寫入一個txt文件我與每個文本編輯器得到完全不同的結果,所以你..

任何解決方案?

+1

如何創建的字符串?你提供一個與服務器相匹配的編碼嗎? – Thomas

+0

我使用DatagramPacket與一個字節[]緩衝區並將retreived消息放在一個字符串中,我不提供任何編碼,我不知道如何 – Robin

+2

「我不知道怎麼樣」 - 我建議你看看api然後。有幾個構造函數,比如'String(byte bytes [],Charset charset)'。如果你沒有傳遞字符集/編碼,將使用系統默認值,這很可能不是服務器使用的那種(我建議你在任何IO /轉換等操作中定義字符集)。但是Jorn的方法無論如何都是更好的方法,因爲如果你已經獲得了'byte []',就不需要使用'String'間接。 – Thomas

回答

2

您可以使用Byte.toUnsignedInt到字節直接轉換爲整數:

byte[] bytes = { (byte) 244, 12, 13, (byte) 155 }; // an example input 

int[] ip = new int[4]; 
for(int i = 0; i < bytes.length; i++) { 
    ip[i] = Byte.toUnsignedInt(bytes[i]); 
} 

System.out.println(Arrays.toString(bytes)); // [-12, 12, 13, -101] 
System.out.println(Arrays.toString(ip)); // [244, 12, 13, 155] 
+0

謝謝,這工作。 另外我的問題是,我寫它到一個字符串。現在我只寫一個字節數組並使用這些數據 – Robin