是否可以将十六进制字符串分配给comp或二进制声明的变量?
实施例: 01 COMP-VAR PIC 9(4)COMP。
移动X' 04D2'到COMP-VAR。
应输出+1234。
编辑:
很抱歉缺少这些信息,我只举了一个例子。真实情况是数据将来自外部源,即数据集。在将数据移动到comp声明变量之前,我需要将数据存储在字母数字变量中。我的问题是,当我将字母数字数据移动到comp变量时数据不正确。非常感谢您的帮助。
答案 0 :(得分:6)
我认为您正在寻找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之后的所有数据项都以相同的级别开始 number(示例中为02)并将其重新定义为适当的格式。随后 处理根据REC-TCD中的值使用任何重新定义的记录。