2010-12-08 20 views
0

2バイト配列を比較しようとしました。バイト配列の比較

バイトアレイ1は、SHA1ハッシュの最後の3バイトのアレイである。

private static byte[] sha1SsidGetBytes(byte[] sha1) 
    { 
    return new byte[] {sha1[17], sha1[18], sha1[19]}; 
    } 

バイトアレイ2は、私は16進数の文字列からの3つのバイトで充填する配列である:

private static byte[] ssidGetBytes(String ssid) 
    { 
    BigInteger ssidBigInt = new BigInteger(ssid, 16); 

    return ssidBigInt.toByteArray(); 
    } 

if (Arrays.equals(ssidBytes, sha1SsidGetBytes(snSha1))) 
    { 
    } 
無し時々ほとんどの時間の作品が、

:それは、この比較がいる可能性がありどのように

t。バイトオーダー?

"6451E6"(16進文字列)の場合は正常に動作しますが、 "ABED74"の場合はそうではありません。

+1

バイト配列にデバッガが含まれているものを見ましたか?おそらく、符号付きバイトの問題が発生していますか? –

+0

署名されているかどうかはどのように確認できますか? – tersmitten

答えて

1

BigInteger経由で16進文字列を解析する方法には欠陥があります。たとえば、new BigInteger("ABED74").toByteArray()は、バイトの配列を返します.3つではありません。あなたはこれをハックすることができますが、基本的にはではなく、 BigInteger値を含む何かをしようとしています...あなたは単に16進数を解析しようとしています。

私はあなたが解析を行うためにApache Codecライブラリを使用することをお勧め:

byte[] array = (byte[]) new Hex().decode(text); 

(ApacheのコーデックのためのAPIが望まれるために何かを残し、それが作業を行います。)

+0

それは私が推測する問題でしょうか? 16進数の文字列(長さ6)を3バイトの配列に解析する他の方法はありますか? – tersmitten

+2

@tersmitten:はい、私が言ったように、より大きな仕事を達成するために起こる何かの代わりに、16進文字列をバイトに解析するように設計されたものを使用します。もちろん、サードパーティのライブラリを使う必要はありません。必要に応じて16進数を解析するメソッドを書くのは簡単です。 –

+0

あなたはおそらく正しいですが、私はこれが完全な方法であると思っていました... – tersmitten

3

問題はかなり明白です - どのTHRと等しくなることはないだろうもちろんのよう

BigInteger b1 = new BigInteger("6451E6", 16); 
BigInteger b2 = new BigInteger("ABED74", 16); 

System.out.println(b1.toByteArray().length); 
System.out.println(b2.toByteArray().length); 

は、具体的には、ABED74はそのバイト配列4バイト長であるのBigIntegerを作成します:あなたはこれをしようとした場合eeバイト配列。

簡単な修正は、javadocのの(強調鉱山)から

byte[] ba = ssidBigInt.toByteArray(); 
return new byte[] { ba[ba.length - 3], ba[ba.length - 2], ba[ba.length - 1] }; 
+0

ビンゴ。 toByteArray()メソッドはBigInteger(byte [])コンストラクタと互換性のある入力を生成することを意図しています。 ** this **バイトエンコーディングは、コンストラクタのString入力に対して**一方向**であると言うことができます。入力文字列のbyte []表現は、byte []表現と同じであることが保証されていません文字列から作成されたBigInteger(後でマグニチュードのような追加情報を受け取る可能性があるため) –

1

return ssidBigInt.toByteArray(); 

からssidGetBytesでreturn文を変更することです:

http://download.oracle.com/javase/1.5.0/docs/api/java/math/BigInteger.html#toByteArray%28%29

の2の補数表現を含むバイト配列を返します。 このBigInteger。バイト配列は、 がビッグエンディアンのバイトオーダーになります。 の有効バイトは、 要素の中にあります。配列には 少なくとも1つの符号ビット、 (ceil((this.bitLength()+ 1)/ 8)を含む を含む、このBigIntegerを表す に必要な最小バイト数は です。 (この表現は と(byte [])コンストラクタと互換性があります。)

法)に匹敵ByteInteger(そのtoByteArray(経由(バイト配列を生成します構築のBigIntegerを保証するものではありません文字列、基数)使用しているコンストラクタ)内で起こって計算がたくさんありますStringのgetBytes()エンコーディングの結果に変換します。

toByteArray()の出力はBigIntegerの(byte [])コンストラクタへの入力として(ほとんど)使用されることを意図しています。それ以外の用途については保証しません。

toByteArray()の出力はBigIntegerオブジェクトのバイト表現であり、その中にはすべてmagnitudeのような内部属性を含むが含まれています。これらの属性は入力文字列には存在しませんが、BitIntegerオブジェクトの構築中に計算されます。

これは、入力文字列のバイト表現と互換性がなく、BigIntegerを作成する最初の数値のみを持ちます。