【问题标题】:Decode encrypted cobol file with comp-3 and other data使用 comp-3 和其他数据解码加密的 cobol 文件
【发布时间】:2019-11-03 15:08:35
【问题描述】:

我有一个非人类可读格式的 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 30202020202020202020202020202020

   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;
}

【问题讨论】:

  • 我不会称它为“加密的” ;-) 你试过吗? sourceforge.net/projects/jrecord?也许这已经解决了您的问题,而无需重新发明轮子。
  • 您发布的数据在我看来不像是有效的 COMP-3。文件是否已经进行了一些 EBCDIC->ASCII 转换?然后它已经坏得无法修复。您必须在任何代码页转换之前完成所有 COMP-3 字段的处理,并考虑到相应字帖中定义的记录布局。
  • 这个问题是否已为您解答?如果是,请将任何对您有用的答案标记为“已接受”(并投票赞成任何有用的答案)。如果不澄清缺少什么,我们可以添加它。

标签: java cobol comp-3


【解决方案1】:

编辑文件

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

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

JRecord

JRecord 让你读/写大型机 使用 Cobol Copybook。您可以在recordEditor中生成基本的Java~JRecord代码

How do you generate java~jrecord code for a Cobol copybook

【讨论】:

    【解决方案2】:

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

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

    回到原来的问题:

    如何正确解码整个文件,同时考虑 comp-3 数据和普通数据?

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-05-13
      • 1970-01-01
      • 2016-09-04
      • 2018-10-29
      • 2019-09-22
      • 1970-01-01
      • 2021-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多