2017-02-16 18 views
0

나는 quake 3 엔진 마스터 서버 (이 경우 cod2 마스터 서버)에서 서버 목록을 검색하는 도구를 빌드 중입니다. 이러한 마스터 서버는 IP 포트 정보가 포함 된 큰 문자열로 응답합니다. 여기에있는 ip는 4 문자이며 각 문자는 숫자 (1-255)로 변환되어야합니다. 내가 이것을 시도 할 때 128 이상의 숫자는이 유니 코드 대체 문자 (65533 또는 fffd)로 변환됩니다. PHP에서 함수와 같은 문자열이 모든 작품Java cant가 vars에 대한 올바른 값을 얻음

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)); 

:

나는 몇 가지를 시도 내 자바는 유니 코드를 사용하는 문제가있을 것 같아요

ord(char); 

을하고, 나는 그것이 ascii (또는 확장 아스키, 확실하지 않음)를 사용해야한다고 생각한다.

[8N] < <이 4 개 문자 번역 올바른

ZH < <를 heres 하나 내가 txt 파일에 기록하면 잘못이다, 난 그냥 캔트 내 콘솔에서 바로 문자를 복사하고 난 각 텍스트 편집기로 완전히 다른 결과를 얻을 수 있습니다. 따라서

모든 솔루션?

+1

어떻게 문자열을 만들려면 어떻게해야합니까? 서버의 인코딩과 일치하는 인코딩을 제공합니까? – Thomas

+0

DatagramPacket을 byte [] 버퍼와 함께 사용하고 retreived 메시지를 문자열에 넣었습니다. 인코딩을 제공하지 않습니다. – Robin

+2

어떻게 "모르겠습니다."- API를 살펴볼 것을 제안합니다. 그때. 'String (byte bytes [], Charset charset)'과 같은 생성자가 있습니다. charset/encoding을 전달하지 않으면 시스템 기본값이 사용되며 이는 서버에서 사용되는 것이 아닙니다 (모든 IO/변환 등의 작업에서 charset을 정의하는 것이 좋습니다). 그러나 Jorn의 접근 방식은 어쨌든 더 나은 방법입니다. 왜냐하면'byte [] '를 이미 얻었 으면'String' 간접 참조를 사용할 필요가 없기 때문입니다. – Thomas

답변

2

직접의 int로 바이트를 변환 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