目次
デザインパターンを活用して美しいコードを書く方法を発信しています。開発の効率化が得意です。
工作HardwareHubからのお知らせ
クラスライブラリ java.net.InetAddress
を利用すると、あるホストのIPアドレスを取得できます。
sample.java
import java.net.InetAddress;
class Sample {
public static void main(String args[]) {
try {
// IPアドレスの配列を取得します (あるホスト名に対して複数のIPが割り当てられていることがあります)
InetAddress addrList[] = InetAddress.getAllByName(args[0]);
for(int i=0; i<addrList.length; ++i) {
System.out.println(addrList[i].getHostName()); //ホスト名
System.out.println(addrList[i].getHostAddress()); //IPアドレス (文字列形式)
byte bytes[] = addrList[i].getAddress(); //IPアドレス (バイト形式 (IPv4であれば4バイト))
for(int j=0; j<bytes.length; ++j) {
if(bytes[j]>=0) System.out.print(bytes[j]);
else System.out.print(bytes[j] + 256); //2の補数で扱われる関係で負の数になってしまった場合の補正
if(j<bytes.length-1) System.out.print(".");
}
System.out.println("");
}
// ローカルホストのIP情報の取得に特化したメソッド
InetAddress localHost = InetAddress.getLocalHost();
// IP情報表示
System.out.println(localHost.getHostName());
System.out.println(localHost.getHostAddress());
}
catch(Exception e) {
e.printStackTrace();
}
}
}
実行例
$ javac sample.java && java Sample www.qoosky.io
www.qoosky.io
49.212.166.76
49.212.166.76
your-MacBook.local
192.168.0.1
2の補数の補正 (+256) について
具体例
ビット列11111111は、
- 符号なし整数 (C/C++でいうところのunsigned) として捉えると255
- 符号付き整数 (C/C++でいうところのsigned) として捉えると-1
であり、その差は255-(-1)=256です。そういう訳で、ビット列11111111を符号なし整数として処理するためには、符号付き整数としてJavaに認識されてしまった結果の-1に256を加算すればよいのです。
もう少し一般的な説明
ビット列1*******を符号なし整数として処理するためには、符号付き整数としてJavaに認識されてしまった結果に、補正分
1******* - (-(0%%%%%%%+1)) = (1*******+0%%%%%%%)+1 = 11111111 + 1 = 100000000 = 256
を加算すればよいのです。
0
記事の執筆者にステッカーを贈る
有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。
さらに詳しく →Feedbacks
ログインするとコメントを投稿できます。
関連記事
- Spring Security フォームログインのサンプルコードSpring フレームワークによる Web アプリケーション開発で、ログイン処理を実装する際は Spring Security が便利です。ここでは特に Spring Boot で Web アプリケーションを開発する場合を対象とし、フォームによる ID/Password ログインを行うためのサンプルコードをまとめます。 公式ドキュメント [Spring Security チュートリアル](http...
- Java配列の宣言方法 (C/C++との違い)Javaの配列 Javaの配列宣言方法はC/C++と似ているようで若干異なる。 初期化しない場合 C/C++の int array[10]; はJavaでは int array[] = new int[10]; となる。同様にC/C++の int array[3][3]; はJavaでは int array[][] = new int[3][3]; となる。 初期化
- PlantUML による UML 図の描き方PlantUML はテキスト形式で表現されたシーケンス図やクラス図といった UML (Unified Modeling Language) 図の情報から画像を生成するためのツールです。簡単な使い方をまとめます。 インストール方法の選択 Atom や Eclipse のプラグインをインストールしてエディタから利用する方法、JAR をダウンロードして Java コマンドで実行する方法、Redmine ...
- Akka HTTP サンプルコード (Scala)Akka アクターを用いて実装された汎用 HTTP フレームワークです。Spray の後継です。コアモジュールである akka-http-core は 2016/2/17 に experimental が外れました。akka-http などのいくつかのサブモジュールは 2016/3/1 現在 experimental のままですが、基本的な
- Kestrel の使用例Kestrel は Message Queue (MQ) の実装のひとつです。一般に MQ はアプリケーション間やプロセス間、スレッド間で非同期に通信するために用いられます。メッセージの送信側は MQ に書き込めば受信側の応答を待たずに次の処理に非同期に進むことができます。Kestrel はわずか 2500 行程の Scala で実装されており JVM で動作します。MQ 自体はメモリ上に存在する...