16進数文字列を文字列に変換したいがDatatypeConverterが使えない場合の対処方法!

byte型で保存されている16進数文字列を文字列に変換したい方、必見です。

今回は、Java ライブラリに始めから用意されている Hex や DatatypeConverter が使えない場合の対処方法をお伝えします。

同じ悩みをお持ちの方の参考になれば幸いです。


広告

16進数文字列とは何?

16進数文字列とは、テーブル内にbyte型として保存されるデータのことです。

byte型は、このようなデータのことを言います。

"E38280E3818BE38197E38280E3818BE38197E38081E38182E3828BE381A8E38193E3828DE381ABE38081E3818AE38198E38184E38195E38293E381A8E3818AE381B0E38182E38195E38293E3818CE4BD8FE38293E381A7E38184E381BEE38197E3819FE38082"

これは、「むかしむかし、あるところに、おじいさんとおばあさんが住んでいました。」という文字列をbyte型にしたものです。

byte型は、Javaの基本データ型の中で最も小さな整数型、わずか8ビット(1バイト)しかメモリを消費しません。
よく知られているint型が32ビット(4バイト)、メモリを消費します。

そのため、メモリ効率が良く、バイナリデータ(画像、動画など)を扱うのに適しています。

なぜ16進数文字列を文字列に変換する必要があったか?

DB内のテーブルに16進数文字列(byte型)で保存されているテキストデータがありました。

この16進数文字列を文字列に変換して、何が書いてあるか知りたいという場面が仕事で発生しました。

Java には便利な関数が用意されていて、Hex.decodeHex や DatatypeConverter.parseHexBinary を使えば、簡単にバイト配列に変換できます。

バイト配列に変換できたら、バイト配列を文字列にすれば OK です。
(バイト配列は String クラスでラップするだけで、文字列に変換できます)

・(参考URL) Hex.decodeHex や DatatypeConverter.parseHexBinary のコードサンプル
https://weblabo.oscasierra.net/java-hex-convert-1/

ただ、仕事で使っている Java 環境では、Hex クラスも DatatypeConverter クラスも使えませんでした。

それなら、16進数文字列をバイト配列に変換するコードを書けばいいと思ったのが、はじまりです。

16進数文字列を文字列に変換するコード

16進数文字列を文字列に変換するコードがこちらです。

        String hexString = "E38280E3818BE38197E38280E3818BE38197E38081E38182E3828BE381A8E38193E3828DE381ABE38081E3818AE38198E38184E38195E38293E381A8E3818AE381B0E38182E38195E38293E3818CE4BD8FE38293E381A7E38184E381BEE38197E3819FE38082";

        // DatatypeConverterを使える場合
        System.out.println();
        System.out.println("=== DatatypeConverterが使える場合 ===");
        byte[] bytes1 = DatatypeConverter.parseHexBinary(hexString);  //①バイト配列にしている
        System.out.println(new String(bytes1));  //②文字列にしている

        // DatatypeConverterを使えない場合
        System.out.println();
        System.out.println("=== DatatypeConverterが使えない場合 ===");
        byte[] bytes2 = new byte[hexString.length() / 2];
        for (int i = 0, j = 0; i < hexString.length(); i = i + 2, j++) {
            bytes2[j] = (byte) Integer.parseInt(hexString.substring(i, i + 2), 16);  //①バイトに配列している
        }
        System.out.println(new String(bytes2));  //②文字列にしている

実行例

Javaコンソールで実行した出力結果です。
(Javaライブラリを使った場合と同じ出力結果が表示されていることから、正しいことが分かります)


=== DatatypeConverterが使える場合 ===
むかしむかし、あるところに、おじいさんとおばあさんが住んでいました。

=== DatatypeConverterが使えない場合 ===
むかしむかし、あるところに、おじいさんとおばあさんが住んでいました。

まとめ

Java ライブラリを使えない場合、16進数文字列(byte型)を文字列に変換するのは、意外と大変ということが、伝わりましたでしょうか?

仕事の環境によって、どの Java を使っているかで、このようなことが起こりえますので、よかったら参考にしてみてください。

仕事ではこのやり方で、16進数文字列(byte型)を文字列に変換しましたが、保存しているデータがオブジェクトだったので、結局、詳しい中身は見れませんでした。。

保存しているデータがテキストの場合は、このやり方で通用しますので、ご安心ください。

最後までお読みいただきありがとうございました。


Java を基礎からしっかり学びたい方は書籍を1冊読んでみることをおすすめします。
変数、配列、関数、クラスなどプログラミングの基礎的な概念の説明からオブジェクト指向、多態性(ポリモーフィズム)までをこの1冊でマスターできます。
気になる方は下記のリンクからアクセスしてみてください。


広告

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


ABOUT US
ぽむ
はじめまして! ぽむ と申します。 Java、Kotlin (Android)、VBAなどの開発経験があるITエンジニアです。 備忘録として始めたブログですがみなさまのお役に立てたら光栄です。 英語など IT 以外の話題にも触れていこうと思っています。 詳しい自己紹介についてはこちら! よろしくお願いします。