将 VB EBCDIC 文件转换为 ASCII,其中字帖记录以 01 分隔

Posted

技术标签:

【中文标题】将 VB EBCDIC 文件转换为 ASCII,其中字帖记录以 01 分隔【英文标题】:Convert VB EBCDIC file to ASCII, where copybook records are 01 separated 【发布时间】:2021-10-05 10:06:51 【问题描述】:

我们有一个包含 VB(可变长度)记录的 EBCDIC 文件。与此 EBCDIC 相对应,我们有副本,其中记录以 01 类型分隔,单个记录还包含压缩十进制字段。请建议我们如何将这种 EBCDIC 文件转换为 ASCII。

由于公司安全政策,我们无法安装 RecordEditor。我们正在使用 JRecord 库,我们正在创建如下对象:

ICobolIOBuilder iob = CobolIoProvider.getInstance() 
    .newIOBuilder(copybookName) 
    .setCopybookFileFormat(Convert.FMT_MAINFRAME) 
    .setFileOrganisation(Constant.IO_VB) 
    .setSplitCopybook(CopybookLoader.SPLIT_01_LEVEL) .setFont("cp037");

之后,当我们使用 AbstarctLineReader 逐行读取文件时,它会带有许多特殊字符。请就此提出建议。

【问题讨论】:

文件定义看起来可行。 special character 听起来您已经完成了从 ebcdic 到 ascii 的转换,但这是行不通的。我建议重新访问文件传输 【参考方案1】:

压缩十进制不是“在 EBCDIC 中”,也不是在任何其他代码页中。压缩十进制是 IBM 大型机(和其他)处理器通过一组本机机器指令支持的二进制数格式。它是BCD(二进制编码的十进制)格式的实现。请参阅***上的Binary coded decimal。

【讨论】:

【参考方案2】:

基础知识

在您做任何其他事情之前,您需要:

了解如何区分各种记录类型的记录。它可以是记录开头的字段(名称中可能包含记录类型)。 如果您要从大型机传输文件,则需要小心

转化

可能有用的包

RecordEditor 应该能够使用 Cobol Copybook 编辑文件(您需要导入 Copybook)。 RecordEditor 也可以将文件写入 Xml。

java 项目JRecord 及其子项目CobolToXml 可以进行转换。 RecordEditor 有一些JRecord 的代码生成选项

终于来看看how to generate Java~JRecord code

【讨论】:

由于公司安全政策,我们无法安装 RecordEditor。我们正在使用 JRecord 库,我们正在创建像这样的对象: ICobolIOBuilder iob = CobolIoProvider.getInstance() .newIOBuilder(copybookName) .setCopybookFileFormat(Convert.FMT_MAINFRAME) .setFileOrganisation(Constant.IO_VB) .setSplitCopybook(CopybookLoader.SPLIT_01_LEVEL) .setFont(" cp037");之后,当我们使用 AbstarctLineReader 逐行读取文件时,它会带有很多特殊字符。请就此提出建议。 @sachin bansal:以后请通过编辑您的问题来添加更多信息。【参考方案3】:

压缩十进制,在 EBCDIC 中,如下所示:

005F  005C  005D

第一个值005F 是 PIC 999 COMP-3 无符号值 5。每个数字由一个字节表示,最后一个字节是符号字节。 每个字节都包含两位十进制数字,除了最右边的字节。最右边的字节在左半字节中保存最右边的数字,在右半字节中保存符号。

第二个值005C 是 PIC S999 COMP-3 正值 5。

第三个值005D 是 PIC S999 COMP-3 负值 -5。

现在,压缩十进制在您将其转换为 ASCII 后看起来如何,我不知道。您必须在问题中添加一些十六进制的 ASCII 文件行,这样我们才能看到转换器做了什么。

【讨论】:

压缩小数永远不应该被字符集转换器触及。您必须非常幸运才能获得可逆转换,在大多数情况下,数据只会被破坏。 不能将字符转换应用于压缩十进制字段,并希望结果有用。您必须不理会这些字节,并根据压缩十进制字段的规则解释每个字节的二进制值。 @phunsoft:完成

以上是关于将 VB EBCDIC 文件转换为 ASCII,其中字帖记录以 01 分隔的主要内容,如果未能解决你的问题,请参考以下文章

EBCDIC 到 ASCII 转换

通过 USS 中的 xlc fgets() 控制从 ASCII 到 EBCDIC 的自动转换

Python 和 ebcdic 解码 (zos 1047)

EBCDIC 代码页不转换小写“a”

使用任何开源代码或工具将大型机二进制文件转换为 Ascii

VB.net 读取 Cobol 文件字段(纯二进制、EBCDIC、打包)