【问题标题】:Moving hexadecimal to a comp declared variable in cobol将十六进制移动到 cobol 中的 comp 声明变量
【发布时间】:2014-05-31 20:47:45
【问题描述】:

是否可以将十六进制字符串分配给 comp 或二进制声明的变量?

示例: 01 COMP-VAR PIC 9(4) COMP.

将 X'04D2' 移动到 COMP-VAR。

应该输出+1234。

已编辑:

对不起,我只是举了一个例子。真实情况是数据将来自外部来源,即数据集。在将数据移动到 comp 声明的变量之前,我需要将数据存储在字母数字变量中。我的问题是当我将字母数字数据移动到 comp 变量时数据不正确。非常感谢您的帮助。

【问题讨论】:

  • move 语句不会输出任何内容,您可能必须display 它 :-) 无论如何,您可以自己尝试一下。当这个选项对你开放时,真的有必要问这个问题吗?
  • 有文档记录,你可以试试,你为什么要这么做?如果你想在最终编写 DISPLAY 时看到 1234,为什么不 MOVE 1234
  • 感谢您的突然回复。我编辑了我的问题以反映我所面临的情况。
  • 好吧,您需要再次编辑它。从文件中移动数据与十六进制文字无关。显示您的定义、程序代码和示例数据、您获得的结果、您期望的结果。完整包含您收到的任何消息。
  • 另外,您使用的是什么编译器和操作系统?

标签: cobol


【解决方案1】:

我想你正在寻找REDEFINES。将二进制值重新定义为字符,进行赋值 这不会违反任何分配规则,然后使用二进制表示 后续操作。该程序说明了您的示例:

IDENTIFICATION DIVISION.
PROGRAM-ID. EXAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01.
   02 COMP-VAR PIC 9(4) COMP.
   02 COMP-X   REDEFINES COMP-VAR PIC X(2).
PROCEDURE DIVISION.
   MOVE X'04D2' TO COMP-X
   DISPLAY COMP-VAR
   GOBACK
   .

这显示1234

更大的问题是您为什么需要这样做?我怀疑你试图 读取其中包含多种记录格式的文件。基于一些常见的记录标识符,您 需要以字符或二进制形式读取部分记录。通常这会做一点 在 COBOL 中有所不同。

这里有一个更大的例子来说明我的意思。假设你有一个输入 3 个字节长的记录。当第一个字节是“B”时,它告诉您接下来的两个字节应该是 被视为二进制 (COMP) 值。当第一个字节是“X”时,您需要读取接下来的两个 字节作为文本 (X) 数据。例如,这可能是两条记录的样子:

 X'E7C1C2' 
 X'C204D2'

第一条记录是包含值“AB”(EBCDIC) 的文本记录。第二条记录是二进制包含 值 1234。处理这些记录的程序可能类似于:

 IDENTIFICATION DIVISION.
 PROGRAM-ID. EXAMPLE.
 DATA DIVISION.
 WORKING-STORAGE SECTION.
 01  INPUT-RECORD.
     02 REC-TCD       PIC X.
        88 REC-TCD-BIN   VALUE 'B'.
        88 REC-TCD-CHAR  VALUE 'X'.
     02 REC-DUMMY        PIC X(2).
     02 REC-COMP-VAR  REDEFINES REC-DUMMY  PIC 9(4) BINARY.
     02 REC-CHAR-VAR  REDEFINES REC-DUMMY  PIC X(2).
 PROCEDURE DIVISION.
*
*    THIS IS A CHARACTER RECORD
*
     MOVE X'E7C1C2' TO INPUT-RECORD
     PERFORM DISPLAY-INPUT-RECORD
*
*    THIS IS A BINARY RECORD
*
     MOVE X'C204D2' TO INPUT-RECORD
     PERFORM DISPLAY-INPUT-RECORD
     GOBACK
     .
 DISPLAY-INPUT-RECORD.
     EVALUATE TRUE
         WHEN REC-TCD-BIN
              DISPLAY 'REC TYPE: '     REC-TCD
                      ' BINARY DATA: ' REC-COMP-VAR
         WHEN REC-TCD-CHAR
              DISPLAY 'REC TYPE: '     REC-TCD
                      ' CHAR DATA  : ' REC-CHAR-VAR
         WHEN OTHER
              DISPLAY 'UNKNOWN RECORD TYPE: ' REC-TCD
     END-EVALUATE
     . 

这个程序的输出是:

******************************** Top of Data ***********************************
REC-TYPE: X CHAR DATA  : AB
REC-TYPE: B BINARY DATA: 1234
******************************* Bottom of Data *********************************

查看 INPUT-RECORD 定义。第一个字节确定如何其余的 记录将被解释。 REC-DUMMY 一般定义为“通用”缓冲区 以后要重新定义。在可变长度输入记录的情况下,REC-DUMMY 被定义为与最长的记录变体一样长,因此它的后续REDEFINE 不要“扰乱”编译器。 REC-DUMMY 之后的所有数据项都以相同级别开头 编号(示例中为 02)并将其重新定义为适当的格式。随后的 处理使用基于 REC-TCD 中的值的任何记录重新定义。

【讨论】:

  • 一个非常合理的猜测。但是,从问题I need to store the data in an alphanumeric variable before I move it to a comp declared variable 不知道为什么需要My problem is that the data is incorrect when I move the alphanumeric data to the comp variable 来看,应该是不可能的,应该是编译错误,而不是一些乱码的结果。想知道什么编译器...
  • 你猜它写 NealB。非常感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
  • 2013-03-19
  • 2012-05-01
  • 1970-01-01
相关资源
最近更新 更多