我正在寻找一种将ASCII文本转换成十六进制数据的方法,我指的是你可以获得的十六进制数据
MOVE X'nn' TO MYVAR.然后我需要像一个数字一样使用它(我猜是COMP-3)。
我试着把PIC(X)移动到PIC S9(2)V COMP-3,但不像我想的那样工作.
由于我的问题被标记为不清楚,因此进一步解释:
首先,对不起,我在深夜提出了这个问题,现在我又开始阅读了,是的,还不清楚。
现在,真正的问题是,我想使用char (比如"A")作为十六进制的数字表示来使用它作为内部表的索引。
例如,在C语言中,这可能很容易,可以:
int mynum;
char mytext;
mynum = atoi(mytext);然后使用mychar访问数组。因此,在COBOL中,我有:
01 MY-TABLE.
05 MY-TABLE-ITEM PIC X OCCURS 1000.
01 MY-TEXT PIC X 100.
01 MY-TEXT-X PIC X OCCURS 100.然后,我想迭代MY-TEXT-X并将其转换为十六进制代码,将其存储到一个数值变量(PIC 9(n))中,以便使用它访问MY-TABLE-ITEM,如下所示:
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 100
PERFORM TRANSFORM-DATA
DISPLAY MY-TABLE-ITEM(MY-NUMBER)
END-PERFORM正如我所说的,我认为我可以将一个PIC X移动到一个PIC S9(2)V COMP-3,这样数值变量就可以得到这个值,但是它并不像我预期的那样工作……
编辑:
所以我发现我的编译器不支持内部函数,所以这对我没有帮助.
编辑添加的源代码
所以,这是我使用的源代码,也显示在编译器和执行程序中。
来源:
IDENTIFICATION DIVISION.
PROGRAM-ID. likeatoi.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 the-char PIC X
VALUE "K".
01 the-result PIC 999.
01 the-other-result PACKED-DECIMAL PIC 9(8)
VALUE ZERO.
01 FILLER
REDEFINES the-other-result.
05 FILLER PIC X.
05 char-to-convert PIC X.
01 num pic 9(8).
PROCEDURE DIVISION.
MAINLINE.
* with instrinsic function
* MOVE FUNCTION ORD ( the-char )
* TO the-result.
DISPLAY
">"
the-char
"<"
">"
the-result
"<".
* Old School
MOVE the-char TO char-to-convert.
DISPLAY
">"
the-char
"<"
">"
the-other-result
"<".
MOVE the-other-result TO num.
DISPLAY num.
STOP RUN.现在,我试过的细节如下:
***** 1) 0384: E User-defined word expected instead of reserved word. (scan suCOBOL procedure error 211 at line 17 in ./ESCRITORIO/HEX/LIKEATOI.COB (/home/dohitb/Escritorio/HEX/likeatoi.COB) compiled 17/03/05 20:37:29.
Errors: 0, Warnings: 1, Lines: 37 for program LIKEATOI.
(显示COMP变量的警告,可以)
>A<> <
>A<>A<>K<> <
>K<>K<
04900000所以,正如我所说的,这两种选择都不起作用。最精确的严格现在是使用包装十进制重新定义到PIC 9,但HEX的位置高于"A“,它提供了一个"9”,所以它仍然是无效的。
我想这可能是当地的事。
最终编辑
现在,我对原始源代码做了一个变体:
IDENTIFICATION DIVISION.
PROGRAM-ID. likeatoi.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 the-char PIC X
VALUE "K".
01 the-result PIC 999.
01 the-other-result BINARY PIC 9(4)
VALUE ZERO.
01 FILLER-1
REDEFINES the-other-result.
05 FILLER PIC X.
05 char-to-convert PIC X.
01 the-comp-result COMP PIC 9(4)
VALUE ZERO.
01 FILLER-2
REDEFINES the-comp-result.
05 FILLER PIC X.
05 char-to-convert PIC X.
01 the-packed-result PACKED-DECIMAL PIC 9(4)
VALUE ZERO.
01 FILLER-3
REDEFINES the-packed-result.
05 FILLER PIC X.
05 char-to-convert PIC X.
01 num PIC 9(8).
01 alfa PIC X(20)
VALUE 'ABCDEFGHIJabcdefghij'.
01 FILLER REDEFINES alfa.
05 char PIC X OCCURS 20.
01 w-index PIC 99 VALUE ZEROES.
PROCEDURE DIVISION.
MAINLINE.
PERFORM VARYING w-index FROM 1 BY 1 UNTIL w-index > 20
MOVE char(w-index) TO the-char
* Variations of "Old School" code
MOVE the-char TO char-to-convert OF FILLER-1
MOVE the-char TO char-to-convert OF FILLER-2
MOVE the-char TO char-to-convert OF FILLER-3
DISPLAY
">"
the-char
"<"
" with BINARY >"
the-other-result
"<"
MOVE the-other-result TO num
DISPLAY "Numeric value: " num
DISPLAY
">"
the-char
"<"
" with COMP >"
the-comp-result
"<"
MOVE the-comp-result TO num
DISPLAY "Numeric value: " num
DISPLAY
">"
the-char
"<"
" with PACKED >"
the-packed-result
"<"
MOVE the-packed-result TO num
DISPLAY "Numeric value: " num
END-PERFORM.
STOP RUN.而且,让我惊讶的是,它给了我这个输出
>A< with BINARY >A<
Numeric value: 00000065
>A< with COMP >A<
Numeric value: 00000100(等等)所以现在看来它起作用了。是不是因为我第一次尝试的时候我是在处理05级变量?
看来现在一切都结束了!
谢谢你,比尔,你将在我的项目的问候一节中看到:)
最后是一个细节。
如果我“行动”
MOVE 'A' TO CHAR然后做所有二进制的事情,结果是不同的.举个例子。
用VALUE,"D“是68,而MOVE是60.
发布于 2017-03-05 23:04:06
您一直在使用旧编译器。它符合COBOL 85标准,但不具有1989年对该标准的扩展的固有功能。
而且,它有一种我以前从未遇到过的非标准行为,这很难完全解释(不能访问那个编译器)。
在显示中使用>和<的目的是让您始终准确地知道每个输出字段的长度。你知道是空白的还是不可打印的字符。定义为COMP和二进制的字段的显示只显示一个字符,而不是四个数字数字,这些数字通常保存在两个字节的存储中(例如INT,但限制为9999)。
因此,我建议进行移动,然后将预期的结果定义为二进制和.当定义为COMP时,无法解释的结果。
COMP结果的一个解释可能是计算字段完全由编译器实现者来定义。因此,一个系统上的COMP可能不是与另一个系统上的COMP相同的字段类型(与COMP-1、COMP-2、COMP-3 etC相同)。这就是为什么1985年标准引入了新的名称(例如二进制和打包小数点),以便它们可以在COBOL编译器之间移植。
如果您被困在使用那个编译器,您是不幸的。如果您有可能使用另一个编译器,您可以在其他选择中找到开源GnuCOBOL (我是SourceForge.Net的GnuCOBOL项目讨论区域的主持人)。如果可以的话,可以使用不同的编译器。
这里有一个示例程序,它将在现代COBOL编译器上使用本征函数ORD和以前的一种方法(而且可能仍然是这样做)。注意,如果您的COMP字段是“小endian",则在重新定义下交换填充和字段的顺序。
IDENTIFICATION DIVISION.
PROGRAM-ID. likeatoi.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 the-char PIC X
VALUE "A".
01 the-result PIC 999.
01 the-other-result BINARY PIC 9(4)
VALUE ZERO.
01 FILLER
REDEFINES the-other-result.
05 FILLER PIC X.
05 char-to-convert PIC X.
PROCEDURE DIVISION.
* with instrinsic function
MOVE FUNCTION ORD ( the-char )
TO the-result
DISPLAY
">"
the-char
"<"
">"
the-result
"<"
* Old School
MOVE the-char TO char-to-convert
DISPLAY
">"
the-char
"<"
">"
the-other-result
"<"
STOP RUN
.ORD很简单,它实际上与C中的atoi相同(假设这给了您在排序序列中的位置)。
在第二种情况下,由于COBOL传统上不能有单字节二进制,所以使用重新定义的方法可以在两个字节二进制的低阶部分获得一个字符,因此整个二进制字段表示该字符的表示的“数字值”。
上述产出如下:
>A<>066<
>A<>0065<请注意,ORD给出了排序序列中的位置(二进制零与ORD将返回1),而第二个只给出直接表示(二进制零将给出零)。
如果您只对可打印字符感兴趣,那么在使用这两个值之后,您可能想要“重基”。
注意,我感到困惑的是,您有一个编译器,它支持内联执行,但不支持内部函数。如果拒绝使用二进制文件,则使用COMP代替。
https://stackoverflow.com/questions/42588468
复制相似问题