-2

我有一个非人类可读格式的 cobol 文件:它有 comp-3 格式的数据(数字),还有其他字符串和字符。我有转换 comp-3 格式的算法,但是当我将它应用于文件中的字节数组时,所有字符都被转换并且输出不是正确的。考虑到 comp-3 数据和普通数据,我怎样才能正确解码整个文件?

我将从下面的文件中添加一些行以及我的 comp-3 算法:

Notepad++ 中的文件如下所示(第一行):

AH4820øêæÉ* 200 DBAG DBAG 0
AED S EUR AED S KAS°ê¤ 2 ø TN Øê¤ ð §É! SN ê¤

Notepad++ 中的 ASCII 到 HEX 转换的文件看起来像这样,即使这不应该是正确的:

200F41483438323002C3B8C3AA01C3A6 01C3892A202020202020202020202020 20203230302044424147204442414720 3020202020202020202020202020

   public static String unpackData(byte[] packedData) {
    String unpackedData = "";

    final int negativeSign = 13;
    for (int currentCharIndex = 0; currentCharIndex < packedData.length; currentCharIndex++) {
        byte firstDigit = (byte) ((packedData[currentCharIndex] >>> 4) & 0x0F);
        byte secondDigit = (byte) (packedData[currentCharIndex] & 0x0F);
        unpackedData += String.valueOf(firstDigit);
        if (currentCharIndex == (packedData.length - 1)) {
            if (secondDigit == negativeSign) {
                unpackedData = "-" + unpackedData;
            }
        } else {
            unpackedData += String.valueOf(secondDigit);
        }
    }
    return unpackedData;
}
4

2 回答 2

3

...使用 comp-3 和其他数据加密的 cobol 文件 ...不是人类可读的格式

不要将两者混为一谈。当通过交换单词进行加密时,加密文件实际上可能是人类可读的(只是不包含合理的东西)。不是人类可读的格式与加密没有任何关系(我不明白为什么这被标记为弹簧)。

回到原来的问题:

考虑到 comp-3 数据和普通数据,我怎样才能正确解码整个文件?

您将字节数组拆分为“正常”范围(在您的情况下,我认为您的意思是未打包,很可能是单字节编码)和“编码”(打包)数据。

然后将解压缩的数据转换为字符串(实际上是 UTF-16)或数字类型和打包的数据(没有检查您的 comp-3 解压缩是否正确但看起来很好,至少不是完全错误[其他13可能不是唯一可能的负号标记,但这取决于数据生成系统])到数字类型。

COBOL 是基于记录的,主要是固定长度,因此“解码文件”的关键是将文件拆分为记录和字段(获取原始 COBOL 记录定义)。在大多数情况下,您将创建一个与 COBOL 定义具有相同属性的 pojo,并让一段代码按位置将字节数组拆分为记录和字段,根据需要转换这些片段并使用结果调用您的设置器。人类可读:一种简单的方法可能是生成 toString 方法......

于 2019-06-20T19:03:48.443 回答
1

编辑文件

任何支持 EBCDIC 的十六进制编辑器都应该能够以可读的形式显示文件。Wikipedia建议 HxD、VEdit、UltraEdit、WinHex 是支持 Ebcdic 的十六进制编辑器。

另一种选择是recordEditor 它可以显示带有/不带有 Cobol Copybook 的文件

在此处输入图像描述

记录

JRecord允许您使用 Cobol Copybook 读取/写入 Mainframe。可以在recordEditor中生成基本的Java~JRecord Code

请参阅如何为 Cobol 抄写本生成 java~jrecord 代码

于 2019-06-21T12:25:28.753 回答