
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コードに変換せずに、表示させる方法を教えて下さい。
もしくは、受信データをバイナリで表示する方法があれば、そちらも教えていただけるとありがたいです。
よろしくお願いします。
No.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の数値を表示する方法はありますでしょうか?
よろしくお願いします。
間違いに気づきました。
文字列に変換して「?」となってしまった物をbyteで表示させても「63」と出るのはあたりまえですね。
byte[] receive = receiveData.getBytes();
ではなく、
byte[] receive = receivePacket.getData();
とやってやると「255」を送信すると、「-128」が表示されました。
それについては
http://www.creativegear.jp/2011/05/09/java_byte_ …
こちらのページで書かれていたByte型からInt型への変換方法で変換することができました。
この問題で何時間も悩んでいたのですが、解決できました。
ありがとうございました。
No.1
- 回答日時:
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では無く、他の型に変換する必要があるのでしょうか?
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- Java Java 配列<選挙> 4 2023/07/31 15:07
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- HTML・CSS GETをPOSTに変更したところ 送信 不能です。 1 2022/04/10 17:31
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JSPでのself.print()作成について
-
Java Silverサンプル問題について
-
「すでに開かれている」の意味...
-
System.out.printで空文字
-
ファイル書き込みに関して
-
JAVA CSV加工について
-
Eclipseのコンソールを常に表示...
-
VHDLでこんな事できますか?
-
tomcat5.5のログファイル名称の...
-
java勉強中に、ユニコード、エ...
-
1~100までの数字を表示したい
-
flush()とclose()について
-
double型の減算がうまくいかない
-
ダブルクォーテーション(””)...
-
GIF画像生成
-
Log4Jではログを改行できない?
-
System.err. printlnとSystem.o...
-
javaプログラムの実行時間
-
CSVファイルへ出力
-
Javaで改行などが出来ないのです。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.err. printlnとSystem.o...
-
Javaで改行などが出来ないのです。
-
1~100までの数字を表示し、か...
-
system.out.printが出力されない
-
1~100までの数字を表示したい
-
System.out.printlnの出力先
-
一定のスペースを空けて端を揃...
-
flush()とclose()について
-
Log4jで機能毎に別ファイルへ出...
-
Tomcatが無応答となる現象が起...
-
行列の表示
-
InputStreamはreadが1回しかで...
-
数字文字列をパック10進数に変...
-
switch分が機能しません。
-
System.out.printlnの意味がよ...
-
JavaScriptの変数をjavaのメソ...
-
Log4Jではログを改行できない?
-
テキストエリアで改行する
-
【SQLServer接続のJSPの記述を...
-
CSVファイルへ出力
おすすめ情報