如何将大型机二进制文件转换为可读形式

Man*_*ish 0 java binaryfiles mainframe ebcdic

我们通过XCOM接收二进制格式的 EBCDIC 大型机文件。目前,有一个基于 C 的遗留应用程序正在将其转换为可读的 ASCII 格式。该文件现在如下所示:

在此输入图像描述

作为迁移的一部分,我们必须迁移 Java 上的遗留应用程序。您能否建议或分享一些如何将该二进制文件转换为 Java 可读格式的链接?

Joo*_*gen 5

EBCDIC - 就像 ASCII 或 Latin-1 - 是文本。您可以尝试其中之一"Cp037", "Cp500", "Cp1047"。因为有不止一种 EBCDIC 变体,请查看维基百科等。不幸的是,并非所有字符集都是由 Java SE 提供的。请参阅在 Java 中将字符串从 ASCII 转换为 EBCDIC?

从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);
Run Code Online (Sandbox Code Playgroud)

您可能会遇到行结尾问题,因为在 Unicode 中,源自 EBCDIC 的 NEL (U+0085) 是合法的换行符/回车符。使用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();
Run Code Online (Sandbox Code Playgroud)
    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
Run Code Online (Sandbox Code Playgroud)