2017-01-18 10 views
0

これはおそらく簡単な答えですが、わかりません。私はメッセージのBase32セクションをデコードしようとしていますが、Apache Commonsデコーダが期待している結果は得られません。なぜApache Commons Base32のデコードで空の配列が返されますか?

base32 = new Base32(true); 
byte[] value = base32.decode(new String("F=======").getBytes()); 

値は、あなたがのが真の六角=を使用すると言うブールのコンストラクタを使用している空の配列

答えて

1

私はあなたの質問を最初に完全に誤解していたと思います。

なぜApache Commons Base32デコードで空の配列 が返されますか?

回答です。これはApache Commons Base32デコードライブラリだけではありませんが、よく書かれたベース32デコードアルゴリズムは空の値を返します。どうして? base32エンコーディングアルゴリズムがエンコーディングの結果として "F ======="という文字列を生成することはできません。

デコードされた文字列 "F8 ======"の例を使って、base32デコードアルゴリズムを理解してみましょう。 "="は実際のbase32文字ではないことに注意してください。これは単にパディングに使用されます。実際のコード化された文字列は "F8"です。

Base32hex character mapを見ると、Fと8の小数値はそれぞれ15と8であり、それぞれ00001111と00001000という2進数で表されます。 Base32が意味するように、5ビット(32 = 2^5)のセットで動作します。したがって、5ビットの組にグループ化されたときの同じ2進数は、それぞれ01111および01000として表される。アルゴリズムごとに、これらの5ビットセットは、「01111 01000」または「0111101000」としてスペースなしで一緒に配置されます。次に、この番号は、左から "01111010 00"を与える8ビットのセットにグループ化される。ここで2番目のセットは8ビットすべてを持っていないので不完全なセットなので、破棄されて01111010という値を残します。これは10進数に変換すると122になります。値122はASCII文字 'z'にマッピングされます。したがって、 "F8"の解読の答えは "z"です。

このアルゴリズムを「F =======」の例で適用すると、パディングを破棄すると「F」だけになりますが、不完全なセットである「01111」のセットだけが得られますそれは8ビットすべてを持っていないからです。したがって、空の値が結果として返されます。

0

です。 文字列に16進値がありません。 行1では、Base32()コンストラクタを使用します。

+0

ブール値は私が使用しているBase32hexアルファベット(Triacontakaidecimal)の使用です。 – KDoyle

+0

私はapacheのCommons Base32.decodeソースに行きました。バイト配列を入力として使用します。あなたには文字列があります。 "F ======="を使用します。getBytes() –

+0

はい。そこにタイプミス。私は編集します。 getBytes()はまだ空の配列にデコードします。キャッチをありがとう。 – KDoyle

関連する問題