📜  如何在 java 中显示文件的十六进制详细信息(1)

📅  最后修改于: 2023-12-03 15:08:38.734000             🧑  作者: Mango

如何在 Java 中显示文件的十六进制详细信息

有时候,我们需要查看一个文件的十六进制详细信息,以便更好地了解文件的结构。本文将介绍如何在 Java 中显示文件的十六进制详细信息。

代码实现

以下是一个简单的 Java 代码示例,可用于显示文件的十六进制详细信息:

import java.io.FileInputStream;
import java.io.IOException;

public class HexDump {
    public static void main(String[] args) {
        if (args.length != 1) {
            System.err.println("Usage: java HexDump filename");
            return;
        }

        try (FileInputStream input = new FileInputStream(args[0])) {
            byte[] buffer = new byte[16];
            int offset = 0;

            while (input.read(buffer) != -1) {
                System.out.printf("%08X: ", offset);

                for (int i = 0; i < 16; i++) {
                    if (i < buffer.length) {
                        System.out.printf("%02X ", buffer[i]);
                    } else {
                        System.out.print("   ");
                    }

                    if (i == 7) {
                        System.out.print(" ");
                    }
                }

                System.out.print(" ");

                for (int i = 0; i < buffer.length; i++) {
                    if (i == 8) {
                        System.out.print(" ");
                    }

                    if (buffer[i] >= 32 && buffer[i] <= 126) {
                        System.out.print((char)buffer[i]);
                    } else {
                        System.out.print(".");
                    }
                }

                System.out.println();

                offset += buffer.length;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
代码分析

代码中的 main 方法接受文件名作为命令行参数。它创建一个 FileInputStream 对象来读取文件内容,并使用 16 字节缓冲区来处理数据。

接下来,代码进入一个循环,该循环从文件中读取缓冲区大小的数据,并将其写入标准输出。在写入数据之前,代码将偏移量打印为一个十六进制数字。接下来,代码显示 16 个十六进制数,表示缓冲区中的字节。如果缓冲区不足 16 字节,则余下的部分将被填充为空格。

代码还将显示每个字节对应的 ASCII 字符,如果字节已经超过 ASCII 范围(32-126),则显示“.”代替。

运行示例

以下是运行本示例代码的命令和输出:

$ java HexDump HexDump.java
00000000: 69 6D 70 6F 72 74 20 6A   61 76 61 2E 69 6F 2E 46   import java.io.F
00000010: 69 6C 65 69 6E 70 75 74   53 74 72 65 61 6D 3B 0A   ileInputStream;.
00000020: 0A 70 75 62 6C 69 63 20   63 6C 61 73 73 20 48 65   .public class He
00000030: 78 44 75 6D 70 20 7B 0A   20 20 20 20 70 75 62 6C   xDump {\n    publ
00000040: 69 63 20 73 74 61 74 69   63 20 76 6F 69 64 20 6D   ic static void m
00000050: 61 69 6E 28 53 74 72 69   6E 67 5B 5D 20 61 72 67   ain(String[] arg
00000060: 73 29 20 7B 0A 20 20 20   20 69 66 20 28 61 72 67   s) {\n    if (arg
00000070: 73 2E 6C 65 6E 67 74 68   20 21 3D 20 31 29 20 7B   s.length != 1) {
00000080: 0A 20 20 20 20 20 20 20   53 79 73 74 65 6D 2E 65   .        System.e
00000090: 72 72 2E 70 72 69 6E 74   6C 6E 28 22 55 73 61 67   rr.println("Usag
000000A0: 65 3A 20 6A 61 76 61 20   48 65 78 44 75 6D 70 20   e: java HexDump 
000000B0: 66 69 6C 65 6E 61 6D 65   22 29 3B 0A 20 20 20 20   filename");.    
000000C0: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20 20                       
000000D0: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20 20                     
000000E0: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20 20                     
000000F0: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20 20                     
00000100: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20 20                     
00000110: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20                       
00000120: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20 20                     
00000130: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20 20                     
00000140: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20 20                     
00000150: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20 20                     
00000160: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20 20                     
00000170: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20 20                     
00000180: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20 20                     
00000190: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20 20                     
000001A0: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20 20                     
000001B0: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20 20                     
000001C0: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20 20                     
000001D0: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20 20                     
000001E0: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20 20                     
000001F0: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20 20                     
00000200: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20 20                     
00000210: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20 20                     
00000220: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20 20                     
00000230: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20 20                     
00000240: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20 20                     
00000250: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20 20                     
00000260: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20 20                     
00000270: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20 20                     
00000280: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20 20                     
00000290: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20 20                     
000002A0: 20 20 20 20 20 20 20 20   20 20 20 20 20 20 20 20                     
000002B0: 20 20 20 20 20 20 20 20                                 
$ 
结论

通过这个 Java 示例,我们可以很容易地在控制台中查看文件的十六进制详细信息,这对于了解文件的内部结构非常有用。我们可以在代码中添加更多的逻辑,比如可以查询文件的指定部分,或者提取文件中特定的信息。