byte配列の16進数ダンプ:Java

プロトコル実装の際、送受信データをバイナリとアスキーの両方で確認したいことが多々あります。

標準出力で確認できるようテキスト(String)に変換するサンプルプログラムを作成しました。

public String hexDump(final byte[] data, int length) {
        if(data == null) {
            return "\r\n";
        }
        // 指定長よりデータ長が短い場合はデータ長に合わせる
        if(length > data.length) {
            length = data.length;
        }
        
        int letters = 0;  //文字数カウント
        StringBuilder binarySB = new StringBuilder();
        StringBuilder asciiSB = new StringBuilder();
        StringBuilder result = new StringBuilder();
        Formatter formatter = new Formatter(binarySB);
        
        while(letters < length) {
            formatter.format("%04x   ", letters);
            for(int column = 0; column < 16; column++, letters++) {
                if(letters < length) {
                    formatter.format("%02x ", data[letters]);
                    if(data[letters] >= 0x20 && data[letters] <= 0x7e) {
                        asciiSB.append((char)data[letters]);
                    } else {
                        asciiSB.append('.');
                    }
                } else {
                    binarySB.append("   ");
                }
                if(column == 7) {
                    binarySB.append(" ");
                    asciiSB.append(" ");
                }
            }
            result.append(binarySB).append(" ").append(asciiSB).append("\r\n");
            binarySB.setLength(0);
            asciiSB.setLength(0);
        }
        
        formatter.close();
        return result.append("\r\n").toString();
    }