■ はじめに
https://dk521123.hatenablog.com/entry/2014/08/02/234119
などで、byte配列を16進数文字列 に変換する必要があり 以前は、以下のように独自にしていたが、簡単に実装できるのでメモ。
以前の実装: byte配列⇒16進数文字列 の変換
byte[] hashValues = messageDigest.digest(); StringBuffer stringBuffer = new StringBuffer(); for (byte hashValue : hashValues) { stringBuffer.append(String.format("%02x", hashValue)); } returnValue = stringBuffer.toString();
修正後
returnValue = DatatypeConverter.printHexBinary(hashValues);
【1】byte配列⇔16進数文字列 の変換
[1] Apache Commons Codec の Hex クラスの利用 [2] DatatypeConverter クラスの利用
コメント
[1]は、ライブラリなので以下からダウンロードして JARをインポートする
https://commons.apache.org/proper/commons-codec/download_codec.cgi
[2]は、標準APIなのでダウンロード不要。 ただ、以下の「参考文献」で言われている 『DatatypeConverter クラスが属するのが javax.xml.bind パッケージであり、 XML関連クラスである位置づけなので、 本来の用途として合っていないのではないかと思うと、 筆者は少し気持ち悪く感じてしまいます』 ってのがあるが。。。
注意:「Apache Commons Codec の Hex クラス」と「DatatypeConverter クラス」の違い
実は、このことが今回のブログの本当の目的 大した事じゃないかもしれないが、 Hex.encodeHexString()で実装されていたコードを DatatypeConverter.printHexBinary() で置き換えたのだが、 単体試験が通らなかった。
結論
* 結果が、小文字・大文字の違いがある => もし、移行する際は気を付けて下さい
【2】サンプル
import javax.xml.bind.DatatypeConverter; import org.apache.commons.codec.binary.Hex; public class Main { public static void main(String[] args) { System.out.println("Result1 : " + Hex.encodeHexString("あいう".getBytes())); System.out.println("Result2 : " + DatatypeConverter.printHexBinary("あいう".getBytes())); } }
出力結果
結果が、小文字・大文字の違いがある Result1 : 82a082a282a4 Result2 : 82A082A282A4
参考文献
http://weblabo.oscasierra.net/java-hex-convert-1/
関連記事
【Java】ハッシュで暗号化する
https://dk521123.hatenablog.com/entry/2014/08/02/234119