解码二进制编码的十进制

时间:2016-05-05 19:01:14

标签: cobol bcd

我有一个字段图片X(03),其日期为X' 160101'格式yymmdd。

我想知道如何将其转换为pic x(06)。

到目前为止,我试图将它移回9(03)comp并移动 9(03)comp to a 9(06)但它没有工作。

我该怎么做?

2 个答案:

答案 0 :(得分:3)

你拥有的是二进制编码的十进制(BCD)。也就是说,数据保存在二进制字段中,但它是十进制表示,而不是二进制,这对于值很重要。 X'160101'将是1,442,049。 X'160201'将是1,442,305。因此,如果您能够将其视为二进制字段(您必须预先设置二进制零以使其成为二进制字段的正确长度),则必须进行一些愚蠢的计算。

所以你做了一些与众不同的事情。 BCD不是本机COBOL数据类型。 PACKED-DECIMAL(通常与COMP-3 / COMPUTATIONAL-3相同)是BCD类型,其包括低位(最右侧)半字节中的符号值。所以不是一个BCD,但你可以将你的BCD视为PACKED-DECIMAL:

01  BCD-TO-PACKED.
    05  BTP-SOURCE-BCD                  PIC XXX.
    05  BTP-PACKED-ZERO  PACKED-DECIMAL PIC 9 VALUE ZERO.
01  FILLER 
    REDEFINES BCD-TO-PACKED.
    05  BTP-PACKED-TO-MOVE
                         PAKCED-DECIMAL PIC 9(6)V9.

01  DATE-AS-PIC-X                       PIC X(6).
01  DATA-AS-CHARACTER-NUMERIC
    REDEFINES DATE-AS-PIC-X             PIC 9(6).


    MOVE your-source-value       TO BTP-SOURCE-BCD
    MOVE BTP-PACKED-TO-MOVE      TO DATA-AS-CHARACTER-NUMERIC

之后,您可以愉快地引用DATE-AS-PIC-X来随心所欲地做任何事情。

BCD-TO-PACKED是一个四字节的组字段,它通过VALUE子句并且没有任何变化,最后由X'0F'组成。这是一个带有一位数和零值的无符号压缩十进制字段。

然后你为BTP-SOURCE-BCD做X-to-X MOVE。 BCD-TO-PACKED现在看起来像这样:X'1601010F'。这对于压缩十进制字段完全有效。你可以把它除以10来得到你的日期(将它重新定义为PACKED-DECIMAL PIC 9(7)),但为什么要浪费CPU?

相反,在REDEFINES中定义一个小数位(V9)。当编译器生成代码以将其移动到另一个没有小数位的数字字段时,源小数位将被删除。普雷斯托!除以10除以。

注意:所选的数据名称有助于解释。您应该使您的数据对数据有意义,而不仅仅是使用“陈腐”名称。 “字符数字”在COBOL中称为USAGE DISPLAY,如果未提供USAGE,则为默认值。 USAGE这个词本身很少使用。因此,当存在PIC X或PIC 9字段而没有其他用途时,使用USAGE DISPLAY。

注意:您可能不应该使用两位数的年份。您将无法处理早于2000年或晚于2199年的日期。历史使用两位数的年份是由于昂贵的磁盘存储和“数据冗余”(所有世纪值都是19,所以为什么保持值为19 80同一帐户的不同时间)。如果使用两位数年份,请确保某个地方与本世纪有关。

注意:如果您尝试将PIC X字段移动到数字字段,编译器将假定您在字段中有有效的字符编号,这是原始尝试失败的原因之一。

答案 1 :(得分:2)

如果你搜索stackoverflow,你应该找到答案(这已经得到了解答)。

但是创建一个像(my-date-x保存日期)的字段:

   03  my-date-x            pic x(3).
   03  my-date-9            pic 9(6).

   03  date-ymdv0           pic 9(6)v9 comp-3.
   03  date-x               pic x(3) redefines date-ymdv0.

代码是

   Move 0                   to date-ymdv0 
   Move my-date-x           to date-x
   Move date-ymdv0          to my-date-9

它起作用的原因是 9(6)v9 comp3 160101存储为x'1601010c' 这就是你所拥有的(最后+一个0c)。