如何将大型机二进制文件转换为可读形式
How to convert mainframe binary file to readable form
我们正在通过 XCOM 接收二进制格式的 EBCDIC 大型机文件。目前,有一个遗留的基于 C 的应用程序正在将其转换为可读的 ASCII 格式。这是文件现在的样子:
作为迁移的一部分,我们必须迁移 Java 上的遗留应用程序。您能否建议或分享一些 link 如何将该二进制文件转换为 Java 中的可读格式?
EBCDIC - 类似于 ASCII 或 Latin-1 - 是 text。您可以尝试 "Cp037", "Cp500", "Cp1047"
之一。由于有不止一种 EBCDIC 变体,请检查维基百科等。不幸的是,并非每个字符集都由 Java SE 提供。参见 Convert String from ASCII to EBCDIC in Java?
因为 java 11 你可以使用 Files.readString/writeString,否则需要使用 Files.readAllBytes.
Path ebcdicPath = Paths.get("...");
Path utf8Path = ebcdicPath.resolveSibling("utf8.txt");
Charset ebcdic = Charset.forName("Cp1047");
String content = Files.readString(ebcdicPath, ebcdic);
Files.writeString(utf8Path, content, StandardCharsets.UTF_8);
您可能会遇到行尾问题,因为在 Unicode 中,EBCDIC 原始 NEL (U+0085) 是合法的 newline/carriage return。使用 Files.lines
将字符串行结尾。
一些字节的十六进制转储代码:
Path path = Paths.get("...");
byte[] content = Files.readAllBytes(path);
for (int i = 0; i < 16; ++i) {
System.out.printf(" %02x", content[i] & 0xFF);
}
System.out.println();
byte[] c = {(byte)0xf0, (byte)0xf0, (byte)0xf0, (byte)0xf0, (byte)0xf0, (byte)0xf9, (byte)0xf7, (byte)0xf7,
(byte)0xf1, (byte)0xf2, (byte)0xf2, (byte)0xf0, (byte)0xf3, (byte)0xf2, (byte)0xf1, (byte)0xf0};
Charset ebcdic = Charset.forName("Cp1047");
System.out.println(new String(c, ebcdic));
0000097712203210
我们正在通过 XCOM 接收二进制格式的 EBCDIC 大型机文件。目前,有一个遗留的基于 C 的应用程序正在将其转换为可读的 ASCII 格式。这是文件现在的样子:
作为迁移的一部分,我们必须迁移 Java 上的遗留应用程序。您能否建议或分享一些 link 如何将该二进制文件转换为 Java 中的可读格式?
EBCDIC - 类似于 ASCII 或 Latin-1 - 是 text。您可以尝试 "Cp037", "Cp500", "Cp1047"
之一。由于有不止一种 EBCDIC 变体,请检查维基百科等。不幸的是,并非每个字符集都由 Java SE 提供。参见 Convert String from ASCII to EBCDIC in Java?
因为 java 11 你可以使用 Files.readString/writeString,否则需要使用 Files.readAllBytes.
Path ebcdicPath = Paths.get("...");
Path utf8Path = ebcdicPath.resolveSibling("utf8.txt");
Charset ebcdic = Charset.forName("Cp1047");
String content = Files.readString(ebcdicPath, ebcdic);
Files.writeString(utf8Path, content, StandardCharsets.UTF_8);
您可能会遇到行尾问题,因为在 Unicode 中,EBCDIC 原始 NEL (U+0085) 是合法的 newline/carriage return。使用 Files.lines
将字符串行结尾。
一些字节的十六进制转储代码:
Path path = Paths.get("...");
byte[] content = Files.readAllBytes(path);
for (int i = 0; i < 16; ++i) {
System.out.printf(" %02x", content[i] & 0xFF);
}
System.out.println();
byte[] c = {(byte)0xf0, (byte)0xf0, (byte)0xf0, (byte)0xf0, (byte)0xf0, (byte)0xf9, (byte)0xf7, (byte)0xf7,
(byte)0xf1, (byte)0xf2, (byte)0xf2, (byte)0xf0, (byte)0xf3, (byte)0xf2, (byte)0xf1, (byte)0xf0};
Charset ebcdic = Charset.forName("Cp1047");
System.out.println(new String(c, ebcdic));
0000097712203210