Base582016年04月23日(編集2016年04月23日)Tweetこの記事は、ビットコインで利用されているバイナリ変換形式のBase58の説明をします。コードを通して、Base58の仕様と実装方法を理解します。1.8.0_77を利用します。中級者向けBase58Base58は、バイナリデータを58種類の文字で表現するフォーマットです。Base64との違いは、l(小文字:エル)と1(数字:いち)のような間違えやすい文字を除外していることです。使用可能な文字は123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyzです。文字列の並び順Base58で利用する58種類の文字は、アプリケーションによって並び順を変えて利用されています。Base58を利用している有名なアプリには、ビットコインの他にフリッカーの短縮URLがあります。この二つのアプリでは、58種類の文字を以下の並び順で利用しています。123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyzエンコード実装ここからは、実際にビットコインで使用しているBase58のエンコードを実装します。JavaでBase58クラスとencodeメソッドを作成します。}}Base58のエンコード処理手順は以下の通りです。文字列(バイナリ)を16進数に変換する16進数を10進数に変換する10進数を58種類の文字列に変換する文字列を逆順にするこれだけです。上記のコードを使って詳しく説明していきます。DatatypeConverter.printHexBinary(b);DatatypeConverterクラスはjava1.6から導入されたライブラリです。printHexBinaryメソッドはbyte配列を16進数の文字列にして返します。Hexは英語で16進数のことです。16)を使っても10進数に変換できます。約922京(けい)で、Integerより大きなデータが扱えるので、Longを使用しています。decimal/58;}58進数の計算をしています。除算の余りから文字を決定し、新たな文字列を作成しています。最後に文字列を逆順(リバース)にして、58進数にします。デコード実装エンコードしたBase58を元の文字列に戻します。Base58クラスにdecodeメソッドを作成します。}Base58のデコード処理手順は以下の通りです。エンコード文字列を10進数に戻す10進数を16進数に変換する16進数をバイナリ(文字列)に戻す上記のコードで説明します。index_num;}エンコードされた58進数を10進数に戻します。58種類の文字列のインデックス位置を取得して、元の10進数に戻す計算をおこなっています。DatatypeConverterのparseHexBinaryメソッドで16進数文字列をバイト配列にすることができます。このメソッドも、java1.6から導入されています。上記で実装したコードをMainクラスで実装します。}}Eclipseで実行します。terminalZiCaabcabcがZiCaにエンコードされ、ZiCaがabcにデコードされました。まとめBase58は、ビットコインや短縮URLだけでなく、今後も色々なアプリで使用されていくと思います。セキュリティの点からもBaseXXのアルゴリズムの考え方は重要になってくると思うので、ぜひ原理を理解してください。ブラックボックス状態の知識は解消しておきましょう。