JavaでByte型変数をInt型にキャストする際には、気を付けなければならないことがあります。
前回のエントリーで、Byte型配列を16進数文字列に変換するメソッドを作りましたが、その時にByte型をInt型へ変換するには、ただ単にキャスト変換するのではなく、「0xFF」でANDビット演算しなければ値がおかしくなるという事を書きました。
どういう事かというと…
byte a = (byte)0xC8 //10進数では200のはず int b = (int)a; Sytem.out.println(b);
この実行結果は、「200」ではなく、「-56」が表示されます。
それを、
byte a = (byte)0xC8 //10進数では200のはず int b = a & 0xff; Sytem.out.println(b);
とすると、実行結果は「200」になってくれます。
しかし、なぜそのままInt型にキャスト変換するだけじゃダメなのか? なぜ0xFFでAND演算をしたら、期待した数値になるのか?そのあたりが僕の中でもやもやしてました。
「なんだかよく分からないけど、Byte型で作った16進数をInt型に変換する時には、0xFFでAND演算するオマジナイをしなきゃならない」
初級プログラマな僕は、そんな感じで全然理解出来てなかったんですよね。 でも、このオマジナイが僕にとってはブラックボックスで気持ち悪い; 自分が理解出来てないものを、プログラムの中で扱うのなんて落ち着かないったらありゃしません。
そこで、なぜByte型をInt型へそのままキャストしてはいけないのか。なぜ0xFFでAND演算をするとうまく変換されるのか。 そのオマジナイの中身を調べてみることにしました。
オープンソースのパケットキャプチャソフト「WireShark」。。。ネットワーク関係のお仕事をされている方は使った事のある方も多いかと思います。
最近MacBookProをメインの開発環境にしようかと思い、Eclipseを入れました。
自分でサーバを構築して運用してみようと思い、DTI ServersManのVPSを契約しました。
テキストエディタには、それほどこだわりはなくて、色々なもの使っていたのですが、最近Vimを使い始めました。
ある程度プログラムが書けるようになったらば、次にするべきことは、他人の書いたプログラムを読むことである。・・・と、どっかで聞いた気がする。どこで聞いたのか見たのか覚えてないんですが、これって一理あると思うんですよね。