2017-02-16 11 views
0

私は、Quake 3エンジンマスターサーバー(この場合はcod2マスターサーバー)からサーバーリストを取得するツールを構築しています。 これらのマスターサーバーは、ip port infoを含む大きな文字列で応答します。 これは4文字で、数字はそれぞれ1〜255文字に変換されます。 これを試してみると、128を超える数字はこのユニコード置換文字(65533またはfffd)に変換されます。Java cantはvarsの正しい値を取得します

私はいくつか試してみました:PHPで

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

私は問題は私のjavaはユニコードを使用していることかもしれないと思うし、そして私はそれがアスキー(または拡張ascii、わからない)を使用する必要がありますと思う。

[8N] < <これらの4つの文字が翻訳正しい

ZH < < HERESに1私はtxtファイルに書き込む場合は間違っていた、私はちょうどカントは私のコンソールから右のシンボルをコピーして、Iそれぞれのテキストエディタで全く異なる結果が得られますので、そうです。

すべての解決策はありますか?

+1

どのように文字列を作成するのですか?サーバーのエンコーディングに一致するエンコーディングを指定していますか? – Thomas

+0

私はDatagramPacketをbyte []バッファで使用し、取得したメッセージを文字列に入れます。どのエンコーディングも提供しません。 – Robin

+2

どちらかわかりません。 - 私はあなたがAPI次に。 'String(byte bytes []、Charset charset)'のようないくつかのコンストラクタがあります。あなたがcharset/encodingを渡さなければ、システムのデフォルトが使用され、それはサーバによって使用されるものではないでしょう(私はあなたが任意のIO /変換などの操作で文字セットを定義することを推奨します)。しかし、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

関連する問題