2017-02-16 67 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