プロが教える店舗&オフィスのセキュリティ対策術

UDPで数値データを受信してある処理をしようと考えております。

そこで↓のページで公開されている受信プログラムを使用してデータを受信しました。
http://news.mynavi.jp/column/java/052/index.html

import java.net.*;

public class UDPServer {
public static void main(String[] argv)
throws Exception {
// 5100番ポートを監視するUDPソケットを生成
DatagramSocket receiveSocket = new DatagramSocket(5100);

// 受け付けるデータバッファとUDPパケットを作成
byte receiveBuffer[] = new byte[1024];
DatagramPacket receivePacket =
new DatagramPacket(receiveBuffer, receiveBuffer.length);

while (true) {
// UDPパケットを受信
receiveSocket.receive(receivePacket);

// 受信したデータを標準出力へ出力
System.out.println
(new String(receivePacket.getData(),
0, receivePacket.getLength()));
}
}
}


別のプログラムから「50」という数値を送信し、上記のプログラムで受信すると、勝手にASCIIコードに変換されてしまっているようで、ASCIIコードの10進数の50にあたる「2」が出力されてしまいます。

これをASCIIコードに変換せずに、表示させる方法を教えて下さい。
もしくは、受信データをバイナリで表示する方法があれば、そちらも教えていただけるとありがたいです。
よろしくお願いします。

A 回答 (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/number …
というページが。
バイト列として扱えるワケではないでしょうから、複数バイトの受信の場合はループで回す必要はあるかも知れませんが……
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使った方が楽そ~ですな……。

この回答への補足

ありがとうございます。
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の数値を表示する方法はありますでしょうか?

よろしくお願いします。

補足日時:2012/10/02 10:58
    • good
    • 0
この回答へのお礼

間違いに気づきました。
文字列に変換して「?」となってしまった物をbyteで表示させても「63」と出るのはあたりまえですね。

byte[] receive = receiveData.getBytes();
ではなく、
byte[] receive = receivePacket.getData();
とやってやると「255」を送信すると、「-128」が表示されました。

それについては
http://www.creativegear.jp/2011/05/09/java_byte_ …
こちらのページで書かれていたByte型からInt型への変換方法で変換することができました。

この問題で何時間も悩んでいたのですが、解決できました。
ありがとうございました。

お礼日時:2012/10/02 16:58

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では無く、他の型に変換する必要があるのでしょうか?
よろしくお願いします。

補足日時:2012/10/02 01:45
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!