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

表題の件、「strutsによるwebアプリケーションスーパーサンプル第三版」で、以下の処理が理解できませんでした。

//byteを1つ取り、絶対値に変換する
int n = md5[i] & 0xff;

MD5やダイジェスト化について十分に理解できないないこともございますが、よろしければ簡潔にお教えいただけないでしょうか。

よろしくお願いいたします。

A 回答 (2件)

「絶対値に変換する」というコメントは正しくないですね。

たとえばmd5[i]の値が-3だったとしたら、nの値は絶対値の3ではなくて253になります。
ANo.1の方が既に答えていますが、0xffとビットごとの論理積をとるのはbyte型(-128~+127)の値をint型の0~+255の範囲に変換するときの定石の書き方です。
    • good
    • 0
この回答へのお礼

> ANo.1の方が既に答えていますが、0xffとビットごとの論理積をとるのはbyte型
> (-128~+127)の値をint型の0~+255の範囲に変換するときの定石の書き方です。

お陰さまで納得できました。
ありがとうございます<(_ _)>

お礼日時:2012/01/23 23:46

前後がわからないとなんとも言えませんが、


MD5のメッセージダイジェストを取得するなら、
java.security.MessageDigestクラスで行うのが普通ですから、
取得したバイト配列を16進文字列化してたりしませんか?

Javaのbyteは、-128~+127の値を保持できます。
しかし、byteの演算(正確には、byte,char,shortの演算)は、
一旦intに変換されてから行われます。

例えば、0xffはbyteなら2進数で表すと、
11111111bですが、
intに変換されると
11111111111111111111111111111111b
になってしまいます。

10進数で表すと、byteでもintでも-1なんですがね。

これを0xff(11111111b)でandを取ると、
00000000000000000000000011111111b
になるのです。

おそらく、Integer.toHexStringあたりを使っているのではないかと思われますが、
以下のコードを試してみると理解できるかと思います。
byte b = (byte)0xff;
System.out.println(Integer.toHexString(b));
System.out.println(Integer.toHexString(b & 0xff));
    • good
    • 0
この回答へのお礼

2番さんと組み合わせて、自分なりになんとなく理解できました。
ありがとうございました<(_ _)>

お礼日時:2012/01/23 23:45

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