阅读Cobol生成的文件

rau*_*and 5 c# cobol

我目前正在编写ac#application,它将位于两个现有应用程序之间.我所知道的第二个应用程序是它处理第一个应用程序生成的文件.第一个应用程序是用Cobol编写的.

步骤:1)Cobol应用程序,将一些文件和副本写入目录.2)第二个应用程序选择这些文件并处理它们.

我的C#应用​​程序将介于1)和2)之间.它必须拿起1)生成的文件,读取它,修改它并保存它,以便应用程序2)不知道我甚至在那里.

我有一些问题.

  • 首先,如果我在记事本中打开由1)生成的文件,其中大部分都是不可读的,而其他部分则是.
  • 如果我读取文件,修改并保存,我必须使用cobol应用程序使用的相同符号保存文件,以便app 2),不知道我在那里.

我试过用这种方式读取文件,但它仍然不可读:

码:

        string ss = @"filename";

        using (FileStream fs = new FileStream(ss, FileMode.Open))
        {
            StreamReader sr = new StreamReader(fs);
            string gg = sr.ReadToEnd();
        }
Run Code Online (Sandbox Code Playgroud)

此外,如果我找到一种方法使其可读(使用某种编码技术),我担心当我再次保存文件时,我可能会改变它的原始格式.

有什么想法吗?建议?

Nic*_*rey 27

要阅读COBOL-genned文件,您需要知道:

首先,您需要文件的记录布局(副本).COBOL记录布局如下所示:

01  PATIENT-TREATMENTS.
    05  PATIENT-NAME                PIC X(30).
    05  PATIENT-SS-NUMBER           PIC 9(9).
    05  NUMBER-OF-TREATMENTS        PIC 99 COMP-3.
    05  TREATMENT-HISTORY OCCURS 0 TO 50 TIMES
           DEPENDING ON NUMBER-OF-TREATMENTS
           INDEXED BY TREATMENT-POINTER.
        10  TREATMENT-DATE.
            15  TREATMENT-DAY        PIC 99.
            15  TREATMENT-MONTH      PIC 99.
            15  TREATMENT-YEAR       PIC 9(4).
        10  TREATING-PHYSICIAN       PIC X(30).
        10  TREATMENT-CODE           PIC 99.
Run Code Online (Sandbox Code Playgroud)

您还需要一份IBM的操作原理(S/360,S370,z/OS,对我们的目的并不重要).最新版本可从IBM获得

第8章(十进制指令)和第9章(浮点概述和支持指令)对我们来说是有趣的.

没有它,你几乎迷失了.

然后,您需要了解COBOL数据类型.例如:

  • PIC定义了一个字母数字格式的字段(PIC 9(4),例如4个十进制数字,如果丢失则可能填充空格字符).图999V99是5位十进制数字,带有隐含的小数点.所以,等等.
  • BINARY [通常]是带符号的定点二进制整数.通常的大小是半字(2个八位字节)和全字(4个八位字节).
  • COMP-1是单精度浮点.
  • COMP-2是双精度浮点.

如果数据源是IBM大型机,那么COMP-1和COMP-2可能不会是IEE浮点:它将是IBM的16位超额64浮点格式.你需要像S/370操作原理这样的东西来帮助你理解它.

  • COMP-3是"十进制",长度各异.压缩十进制是表示十进制数的紧凑方式.宣言看起来像这样:PIC S9999V99 COMP-3.这表示它是有符号的,由6位十进制数字组成,带有隐含的小数点.压缩十进制表示每个十进制数字作为八位位组的半字节(十六进制值0-9).高位数是最左边八位位组的高位半字节.最右边的八位字节的低半字节是表示符号的十六进制值AF.所以上面的PIC条款将需要ceil( (6+1)/2 )或4个八位字节.值-345.67,如上面的PIC子句所示0x0034567D.实际符号值可能不同(默认值为C /正,D /负,但A,C,E和F被视为正数,而只有B和D被视为负数).有关表示的详细信息,请参阅S\370操作原理.

与COMP-3相关的是十进制分区.这可能被声明为"PIC S9999V99"(带符号,5位十进制数字,带有隐含的小数点).EBCDIC中的十进制数字是十六进制值0xFO - 0xF9.'解包'(主机机器指令)采用压缩十进制字段并转入字符字段.过程是:

  • 从最右边的八位字节开始.反转它,因此符号半字节位于顶部并将其放入目标字段的最右侧八位字节.
  • 从右到左(源和目标两者)工作,剥离压缩十进制字段的每个剩余半字节,并将其放入目标中下一个可用八位字节的低半字节.用六角F填充高半字节.

  • 当源或目标字段耗尽时,操作结束.

  • 如果目标字段没有用尽,则通过用十进制"0"(oxF0)填充剩余的八位字节来左填充零.

因此,如果使用默认符号值(十六进制D)存储,我们的示例值-345.67将被解压缩为0xF0F0F0F3F4F5F6D7('0003456P',在EBDIC中).

[你去吧.稍后会有一个小测验]

  1. 如果COBOL应用程序位于IBM大型机上,文件是否已从其本机EBCDIC转换为ASCII?如果没有,你将不得不进行自我映射(提示:它不一定像看起来那么简单,因为这可能是一个选择性过程 - 只有字符字段被转换(COMP-1,COMP-2,COMP) -3和BINARY得到排除,因为它们是二进制八位字节序列).更糟的是,有EBCDIC表示的多种口味,由于在不同的打印机使用不同国家的实现和不同的打印链.

哦......最后一件事.主机硬件倾向于喜欢在半字,字或双字边界上对齐的不同事物,因此记录布局可能不直接映射到文件中的八位字节,因为在字段之间可能存在填充八位字节以维持所需的字对齐.

祝好运.