📅  最后修改于: 2023-12-03 15:08:38.734000             🧑  作者: Mango
有时候,我们需要查看一个文件的十六进制详细信息,以便更好地了解文件的结构。本文将介绍如何在 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 示例,我们可以很容易地在控制台中查看文件的十六进制详细信息,这对于了解文件的内部结构非常有用。我们可以在代码中添加更多的逻辑,比如可以查询文件的指定部分,或者提取文件中特定的信息。