【问题标题】:Convert signed cobol number in ruby在 ruby​​ 中转换有符号的 cobol 数
【发布时间】:2020-05-30 12:16:40
【问题描述】:

我有一个 ascii 文件,它是来自基于 cobol 的系统的数据转储。

文档说有一个字段是PIC S9(3)V9(7).。

以下是十六进制(和 ascii)字段的两个示例以及它们所代表的结果数字(取自另一个来源)。

Hex                                Reported value 

30 32 38 36 38 35 38 34 35 46      28.687321
ascii : 028685845F

30 39 38 34 35 36 31 33 38 43      -98.480381
ascii : 098456138C

我正在使用 ruby​​,即使添加了隐含十进制,我似乎得到的数字也不正确。我正在尝试解析 IBM Cobol Docs,但我会很感激帮助。

给定“PIC S9(3)V9(7).”的隐含十进制 Cobol 字段,如何使用 ruby​​ 将其转换为有符号浮点数?

【问题讨论】:

  • 你得到了什么数字?从您链接到的文档看来,它们应该是 28.6858456 和 98.4561383(均为正数),它们与报告的值匹配到小数点后 2 位和 1 位(尽管第二个符号翻转)。格式建议值应该有 7 个小数位,但报告的值只有 6 个。
  • 是的,我从那些文档中得到了相同的结果。但是我确定第二个值应该是负值,因为这些是坐标。我尝试了许多其他示例,虽然我得到了几位小数的正确性,但我的转换并不完全正确。
  • 第二个数字是正数。 C、A、F 或 E 的符号半字节为正,所有其他符号为负。也许您的转换是正确的,而您的数据是错误的。
  • 如果你得到 matt 给你的值,基于十六进制输入,那么你的转换是正确的。甚至在您进行转换之前,您的输入是否可能以某种方式损坏?
  • 您可以查看 RecordEditor (record-editor.sourceforge.net),您可以导入 cobol Copybooks(使用 binary_type=Mainframe)并使用 Cobol Copybook 显示文件

标签: ruby cobol


【解决方案1】:

假设数据字节已经通过哑 EBCDIC 到 ASCII 转换器运行,这两个值是 +28.6858456 和 +98.4561383。这意味着生成“报告值”列的任何内容要么被破坏,要么使用不同的字节作为其来源。

看起来报告的值可能是通过低精度浮点转换运行的,但这仍然不能解释第二个错误的符号。

【讨论】:

    【解决方案2】:

    正如 Mark Reed 所说,我认为这些数字是 +28.6858456 和 +98.4561383。

    但是你可以参考这个惊人的文档来了解 ascii 和 EBCDIC 之间的有符号数字: EBCDIC to ASCII Conversion of Signed Fields

    希望对你有帮助

    【讨论】:

      【解决方案3】:
      028685845F
      098456138C
      

      这两个 ASCII 字符串很可能是从 EBCDIC 转换而来的。

      这些是带符号半字节的区域编号,最后变成一个字节。就像其他人所说的那样,F 和 C 是符号的小食。

      查看此网页http://www.simotime.com/datazd01.htm

      • F 代表“无符号”
      • C 代表“有符号的阳性”

      PIC S9(3)V9(7) 告诉你它是 ddd.ddddddd (小数点前 3 位,后 7 位,整个东西都有签名。)

      这两个“字符串”可能是不同的 PIC,您需要检查产生数字的 COBOL 源。

      最好获取 COBOL 数据的原始十六进制转储(可能在 EBCDIC 中),然后发布这些数据。 (但是,我也意识到这是一个 7.5 年前的帖子,OP 可能已经开始了。)我上面写的内容是为将来遇到这个帖子的人写的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-01
        • 1970-01-01
        • 2019-04-21
        • 1970-01-01
        • 2013-01-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多