- ベストアンサー
JavaのUDP受信プログラムで受信データの表示方法について
- JavaのUDP受信プログラムで受信データを正しく表示する方法について教えてください。
- 受信プログラムを使用してデータを受信しましたが、ASCIIコードに変換されてしまい、正しい値が表示されません。
- バイナリ形式で受信データを表示する方法や、ASCIIコードへの変換を抑制する方法について教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>「50」を受け取ったら「50」と表示させたいです。 「数値の50」を受け取ったら「数字の50」として出力したい。 ということでよろしいでしょうか? # 「数値」と「数字」の違いはわかりますか? >System.out.println(receivePacket.getData()); >と、やってみたのですが、よく分からない文字列が出てきました。 「文字列」としては妥当ではありませんから…。 # たぶん、文字列として扱う為の終端コードがないです。 # Javaでの文字列の扱い方次第ではありますが…… で、「Java 数値 数字」で検索すると… http://www.javaroad.jp/java_number2.htm や http://syunpon.com/programing/java/sample/numberformat.shtml というページが。 バイト列として扱えるワケではないでしょうから、複数バイトの受信の場合はループで回す必要はあるかも知れませんが…… receivePacket.getData()でbyte[]の配列を受けとり、ループで回して1つずつtoStrinf()で数字に変換…ですかね。 String.format()を使った方が出力形式に関しては柔軟かもしれません。 # 50という数値を"32"という16進数表記にもできるでしょうし。 # まぁ、"32"では判りにくい…ということであればString.format()で"32h"とかすることも簡単でしょう。 ということで… >これをASCIIコードに変換せずに、表示させる方法を教えて下さい。 そのまま出力はできません。 制御コードとか出力したところでなんだか判りませんから。 なので… >受信データをバイナリで表示する方法 は普通はやりません。 バイナリ値を文字列変換して表示…となります。 # たいていは16進数2桁…という感じの出力にする人が多いでしょうね。 # 1行16バイト分出力…とか。 「Java 16進ダンプ」で検索すると…… http://himtodo.fc2web.com/java/byteToHex.html とか。 # HexDumpEncoder使った方が楽そ~ですな……。
その他の回答 (1)
- Wr5
- ベストアンサー率53% (2173/4061)
Javaはほとんど触れませんが…… >別のプログラムから「50」という数値を送信し、上記のプログラムで受信すると、勝手にASCIIコードに変換されてしまっているようで、ASCIIコードの10進数の50にあたる「2」が出力されてしまいます。 別に勝手にASCIIコードに変換しているわけでも無く50(0x32)の文字コードが'2'なので表示されているのでしょう。 そういう意味では正しく50という数値を受信していると言えるのでは? サンプルは「文字列の受信」を想定しているものかと思われますが、「数値の50」を受け取ったらどう表示して欲しいのでしょうか? その上で… >System.out.println >(new String(receivePacket.getData(), >0, receivePacket.getLength())); が何をしているコードなのか説明できますか?
補足
>>サンプルは「文字列の受信」を想定しているものかと思われますが、「数値の50」を受け取ったらどう表示して欲しいのでしょうか? 「50」を受け取ったら「50」と表示させたいです。 >>System.out.println >>(new String(receivePacket.getData(), >>0, receivePacket.getLength())); >が何をしているコードなのか説明できますか? 受信したデータを文字に変換して出力しているのでしょうか? それでは、受信した数値を表示するには、そのまま出力してやればいいのでしょうか? System.out.println(receivePacket.getData()); と、やってみたのですが、よく分からない文字列が出てきました。 Stringでは無く、他の型に変換する必要があるのでしょうか? よろしくお願いします。
お礼
間違いに気づきました。 文字列に変換して「?」となってしまった物をbyteで表示させても「63」と出るのはあたりまえですね。 byte[] receive = receiveData.getBytes(); ではなく、 byte[] receive = receivePacket.getData(); とやってやると「255」を送信すると、「-128」が表示されました。 それについては http://www.creativegear.jp/2011/05/09/java_byte_to_int/ こちらのページで書かれていたByte型からInt型への変換方法で変換することができました。 この問題で何時間も悩んでいたのですが、解決できました。 ありがとうございました。
補足
ありがとうございます。 byte[] receive = receiveData.getBytes(); for( int i = 0; i < receive.length; ++i ){ System.out.println(Integer.toString(receive[i])); } これで「50」を受信したら「50」と表示させることができました。 しかし、「128」~「255」の数値を送り、 System.out.println(new String(receivePacket.getData(),0, receivePacket.getLength())); で表示させてやると、文字コードに対応する文字が無いためか、128~255の数値は全て「?」と表示されてしまいます。 128~255の数値を上記のfor文で変換してやると、「?」の文字コードにあたる「63」が出力されてしまいます。 128~255の数値を表示する方法はありますでしょうか? よろしくお願いします。