Archive for: 5月, 2011

[Java]Byte型からInt型への変換を本気で考える

5月 09 2011 Published by たけし under Java

whyJavaで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演算をするとうまく変換されるのか。 そのオマジナイの中身を調べてみることにしました。

 

Continue Reading »

One response so far

[Java]MD5、DESで暗号化する

5月 08 2011 Published by たけし under Java, プログラミング

Yellow computer folder with key. Isolated 3d imageJavaで文字列の暗号化をする処理が必要になったので、ライブラリクラスを作ってみました。

とりあえず、非可逆的な暗号化方式としてMD5を。可逆的な暗号化方式としてDESを選択。(※可逆的な暗号化というのは、暗号化された文字列を元の文字列に復号化できる方式。非可逆的な暗号化というのは、もう元には復号化できない方式です。)

引数として渡された文字列を、MD5やDESで暗号化してバイナリ配列を作り、それを16進数表記の文字列として返す。というメソッドを実装しました。

  

Javaには標準で暗号化のための便利なAPIが用意されているんですね。作るのも簡単です。
 

Continue Reading »

No responses yet