cobol - 将十六进制移动到 cobol 中的 comp 声明变量

标签 cobol

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

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

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

应该输出+1234。

编辑:

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

最佳答案

我认为您正在寻找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 被定义为与最长的记录变体一样长,因此它的后续重新定义 不要“扰乱”编译器。 REC-DUMMY 之后的所有数据项都以相同的级别开始 数字(示例中的 02)并将其重新定义为适当的格式。随后的 处理使用基于 REC-TCD 中的值的任何记录重新定义。

关于cobol - 将十六进制移动到 cobol 中的 comp 声明变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23947005/

相关文章:

compiler-errors - “Not a uniquely defined name”什么时候只有一个定义?

关于从 HEAP 分配 WORKING-STORAGE 的 COBOL 存储问题

xml - 在 xml 输出中使用保留的 cobol 名称

大写字母的 COBOL 数据验证?

cobol - OpenCOBOL 入门! ("Hello world!")

cobol - 如果您将文案添加到链接部分而不是将其添加到子程序中的工作存储部分,会发生什么情况?

ibm-midrange - 返回从 cobol 到 rpg 的值

cobol - OpenCOBOL 示例无法编译

java - 是否存在一种在 COBOL 中标准化的 Java 互操作形式?

cobol - COBOL 中的嵌套执行循环?