【问题标题】:conversion of a binary put in a comp -3 field Cobol转换放入 comp -3 字段 Cobol 的二进制文件
【发布时间】:2016-09-04 06:40:57
【问题描述】:

我正在尝试转换已存储有二进制文件的 pic S9 (9)V99 comp-3 字段。显示如下:6/PS X'000000002000'。

此金额应显示为 20.00。我正在尝试找到将其转换为 pic -9 (9)V99 字段的正确方法。

谢谢

【问题讨论】:

  • 正确的方法是创建一个格式化的输出图片 像PIC ---,---,--9.99。
  • 如果我将它移动到 9(05) 字段,它会像这样 X'F0F0F0F0F2' 出现。它不适用于此图片显示。
  • 没有看到您的 COBOL 代码,我看不到 FFFFF 来自哪里。从 PIC S(9)V99 COMP-3 字段到 PIC 9(5) 字段的移动应显示 00020。Stack Overflow 是一个问答网站,而不是我可以在 COBOL PICTURE 的细节方面指导您的地方编码。网上有很多COBOL教程。
  • 我同意你的看法。但是字段中的日期已存储为二进制,就像我之前提到的 X'000000002000' 与定义 S9(9)v99 COMP-3 不匹配。我正在尝试找到提取此内容的正确方法。所以需要做体操来实现这一点。
  • 首先,这是你第一次提到约会。其次,X'000000002000' 在显示时应该是什么样子?在你的问题中,。你说20.00。所以,对于体操。 1) 将 X'000000002000' 转换为 X'00000002000C'。我无法在评论中解释这种转换。 2) 使用从 PIC S9(9)V99 COMP-3 到 PIC ---,---,--9.99 的移动将 X'00000002000C' 转换为 20.00。

标签: binary hex cobol comp-3


【解决方案1】:

这是我的解决方法:

01 WS-ZONENUM11.                                
   05 WS-ZONE9NUM                  PIC 9(009).  
   05 WS-ZONE2NUM                  PIC 9(002).  
01 WS-ZONENUM11-RED    REDEFINES WS-ZONENUM11   
                                   PIC 9(09)V99.

01 WS-AMT-OUT                         PIC -9(009).99. 

01 WS0900-AMT-IN               COMP-3 PIC S9(009)V99.
01 WS0900-AMT-IN-RED  REDEFINES                 
         WS0900-AMT-IN                PIC  X(006).   


 MOVE WS0900-AMT-IN-RED         TO  WS-WS0900-AMT-IN.
 MOVE WS-ZONEX5NM               TO  WS-ZONE9NUM.          
 MOVE WS-ZONEX1NM               TO  WS-ZONE2NUM.          

 MOVE WS-ZONENUM11-RED          TO  WS-AMT-OUT.

WS-AMT-OUT 现在显示为 _00000020.00,其中 _ 是符号(此处的符号将始终为空白,因为它不在二进制金额字段中。

【讨论】:

  • 您从哪里获得 WS0900-AMT-IN?你用的是什么编译器?为什么要在那里使用 REDEFINES?没有必要,而且严格来说,您有重叠的字段,并且 MOVE 的结果是“未定义的”,即使它可能适用于您的特定编译器(它可能不适用于另一个)。您没有显示 ZONEX 字段的定义。你真的有 BCD,就像最近的这个问题:stackoverflow.com/q/37058303/1927206?没有答案,我真的不认为你的代码正在做你认为它正在做的事情。
  • ws0900-amt-in 来自另一个系统 (Tandem),可能使用 TAL 语言,不确定。
【解决方案2】:

Decode a Binary Coded Decimal基本一样

您创建一个多 1 个十进制数字的 comp-3 并执行“pic x”移动。

  01  WS-AMT-IN                 PIC S9(009)V99  COMP-3.
  01  WS-AMT-IN-X  REDEFINES                 
      WS-AMT-IN                 PIC  X(006). 

  01  WS-AMT-OUT1               PIC S9(009)V999  COMP-3.
  01  REDEFINES  WS-AMT-OUT1               
      03 WS-AMT-OUT1-X          PIC  X(006).   
      03                        PIC  s9 comp-3 value zero.

 01  WS-AMT-OUT-2               PIC S9(009)V99  COMP-3.


  Move  X'000000002000'         to WS-AMT-IN-X  
  Move  WS-AMT-IN-X             to WS-AMT-OUT1-x 
  Move  WS-AMT-OUT1             to WS-AMT-OUT-2 

【讨论】:

    【解决方案3】:
    IDENTIFICATION DIVISION.
    PROGRAM-ID. XYZ.
    DATA DIVISION.
    WORKING-STORAGE SECTION.
    01 WS-BIN PIC 9(10).
    01 TEMP PIC Z(10).
    01 EXP PIC 9(2) VALUE 0.
    01 R1 PIC 9(10).
    01 C PIC 9(10).
    PROCEDURE DIVISION.
    
    DISPLAY " ENTER THE BINARY NUMBER ".
    ACCEPT WS-BIN.
    
    PARA1.
    DIVIDE WS-BIN BY 10 GIVING WS-BIN REMAINDER R1.
    COMPUTE C = C + R1 * 2 ** EXP
    ADD 1 TO EXP.
    IF WS-BIN NOT = 0
    GO TO PARA1
    ELSE GO TO PARA2.
    PARA2.
    
    MOVE C TO TEMP
    DISPLAY " THE DECIMAL NUMBER IS " TEMP.
    STOP RUN.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多