Java-转换文件为十六进制-Hex

Java-转换文件为十六进制-Hex

Tags: Java

摘要

Java-转换文件为十六进制-Hex

String.format(%02X)

转换字符串为十六进制

转换字符串为十六进制代码

package cn.javacore.io.file;

import java.io.*;

public class _31_File2Hex {
    public static void convertToHex(PrintStream out, File file) throws IOException {
        InputStream is = new FileInputStream(file);

        int bytesCounter = 0;
        int value = 0;
        StringBuilder sbHex = new StringBuilder();
        StringBuilder sbText = new StringBuilder();
        StringBuilder sbResult = new StringBuilder();

        while ((value = is.read()) != -1) {
            //convert to hex value with "X" formatter
            sbHex.append(String.format("%02X ", value));

            //If the chracater is not convertable, just print a dot symbol "."
            if (!Character.isISOControl(value)) {
                sbText.append((char) value);
            } else {
                sbText.append(".");
            }

            //if 16 bytes are read, reset the counter,
            //clear the StringBuilder for formatting purpose only.
            if (bytesCounter == 15) {
                sbResult.append(sbHex).append("      ").append(sbText).append("\n");
                sbHex.setLength(0);
                sbText.setLength(0);
                bytesCounter = 0;
            } else {
                bytesCounter++;
            }
        }

        //if still got content
        if (bytesCounter != 0) {
            //add spaces more formatting purpose only
            for (; bytesCounter < 16; bytesCounter++) {
                //1 character 3 spaces
                sbHex.append("   ");
            }
            sbResult.append(sbHex).append("      ").append(sbText).append("\n");
        }

        out.print(sbResult);
        is.close();
    }

    public static void main(String[] args) throws IOException {
        //display output to console
        convertToHex(System.out, new File("/home/zhu/javacore.cn/file.txt"));

        //write the output into a file
        convertToHex(new PrintStream("/home/zhu/javacore.cn/file.hex"), new File("/home/zhu/javacore.cn/file.txt"));
    }
}

代码解释

逐个字符读取,%02X转换为十六进制,每行显示16个字符,左边16个十六禁止,中间6个空格,右边对应的字符。
最后一行左右可能不是正好16个字符。中间要补齐多余的空格,方便上下对齐,对比查看。

原始文件是

ABCDEFG
12345678
!@#$%^&*()
Testing only

输出结果

41 42 43 44 45 46 47 0A 31 32 33 34 35 36 37 38       ABCDEFG.12345678
0A 21 40 23 24 25 5E 26 2A 28 29 0A 54 65 73 74       .!@#$%^&*().Test
69 6E 67 20 6F 6E 6C 79 0A                            ing only.