如何使用 COBOL 中的不同输入从 Hex 转换为 Ascii
How do you convert from Hex to Ascii using different inputs in COBOL
我的意图是能够从 HEX-NUM 打印 ascii,但我希望能够更改输入的十六进制值,有点像这样:
WORKING-STORAGE SECTION.
01 HEX-INPUT PIC X(2) VALUE "3C".
01 HEX-NUM PIC X VALUE X"HEX-INPUT".
但是这会导致 错误,因为 X"..."
正在尝试将 HEX-INPUT 读取为十六进制值,而我想访问我定义为 3C 的值.
有什么想法可以实现我想要的这种灵活性吗?
我需要在我的程序中经常更改 HEX-INPUT,因此是个难题。
删除 HEX-INPUT
并使用。
01 HEX-NUM PIC X VALUE X"3C".
如果您想将两个十六进制字符转换为一个字符值,这段代码应该没问题。
WORKING-STORAGE SECTION.
01 HEX-INPUT PIC XX VALUE "3C".
01 HEX-NUM PIC X.
01 HEX-TABLE PIC X(16) VALUE "0123456789ABCDEF".
01 HEX-VALUE COMP PIC 9(4).
01 HEX-TALLY COMP PIC 9(4).
PROCEDURE DIVISION.
BEGIN.
MOVE 0 TO HEX-TALLY
INSPECT HEX-TABLE TALLYING HEX-TALLY FOR
CHARACTERS BEFORE HEX-INPUT (1:1)
COMPUTE HEX-VALUE = HEX-TALLY * 16
MOVE 0 TO HEX-TALLY
INSPECT HEX-TABLE TALLYING HEX-TALLY FOR
CHARACTERS BEFORE HEX-INPUT (2:1)
ADD HEX-TALLY TO HEX-VALUE
MOVE FUNCTION CHAR (HEX-VALUE + 1) TO HEX-NUM
STOP RUN
.
两个字符3C
转换为单个字符,值为X"3C"。
上面的代码还有一个替代方法。我之前没有 post 因为序数值和字母可能会混淆;但是,由于您在评论中提出了这个问题,....
在下文中,hex2val
和val2hex
使用仅包含十六进制字符的有限字母表。因为它们限制了字母表,所以它们必须作为单独编译的程序调用,而不是复制到任何其他程序中,例如执行过程或嵌套程序。
hex2val
将两个字符的十六进制数据项转换为其等效的数值。
val2hex
将数值转换为其等效的两个字符的十六进制数据项。
注意:- 1
和 + 1
分别与 ORD
和 CHAR
函数一起使用。必需,因为 "0"
是有限字母表中的第一个字符 (CHAR (1)
)。
program-id. hex2val.
environment division.
configuration section.
object-computer. computer-name-here
sequence hex-digits
.
special-names.
alphabet hex-digits
"0" thru "9" "A" thru "F"
.
data division.
linkage section.
01 hex-in pic xx.
01 hex-value comp pic 9(4).
procedure division using hex-in hex-value.
begin.
compute hex-value =
(function ord (hex-in (1:1)) - 1) * 16
+ (function ord (hex-in (2:1)) - 1)
exit program
.
end program hex2val.
program-id. val2hex.
environment division.
configuration section.
object-computer. computer-name-here
sequence hex-digits
.
special-names.
alphabet hex-digits
"0" thru "9" "A" thru "F"
.
data division.
linkage section.
01 hex-value comp pic 9(4).
01 hex-out pic xx.
procedure division using hex-value hex-out.
begin.
move function char ( hex-value / 16 + 1 )
to hex-out (1:1)
move function char (
( function mod (hex-value 16)) + 1 )
to hex-out (2:1)
exit program
.
end program val2hex.
请注意,一些名称已更改,但较早的程序可以简化为 CALL
和 MOVE
。附加代码显示调用配套程序。
data division.
working-storage section.
1 hex-in pic xx value "3C".
1 hex-out pic xx value " ".
1 hex-char pic x.
1 hex-value comp pic 9(4).
procedure division.
begin.
call "hex2val" using hex-in hex-value
move function char (hex-value + 1) to hex-char
call "val2hex" using hex-value hex-out
display hex-out
stop run
.
我的意图是能够从 HEX-NUM 打印 ascii,但我希望能够更改输入的十六进制值,有点像这样:
WORKING-STORAGE SECTION.
01 HEX-INPUT PIC X(2) VALUE "3C".
01 HEX-NUM PIC X VALUE X"HEX-INPUT".
但是这会导致 错误,因为 X"..."
正在尝试将 HEX-INPUT 读取为十六进制值,而我想访问我定义为 3C 的值.
有什么想法可以实现我想要的这种灵活性吗? 我需要在我的程序中经常更改 HEX-INPUT,因此是个难题。
删除 HEX-INPUT
并使用。
01 HEX-NUM PIC X VALUE X"3C".
如果您想将两个十六进制字符转换为一个字符值,这段代码应该没问题。
WORKING-STORAGE SECTION.
01 HEX-INPUT PIC XX VALUE "3C".
01 HEX-NUM PIC X.
01 HEX-TABLE PIC X(16) VALUE "0123456789ABCDEF".
01 HEX-VALUE COMP PIC 9(4).
01 HEX-TALLY COMP PIC 9(4).
PROCEDURE DIVISION.
BEGIN.
MOVE 0 TO HEX-TALLY
INSPECT HEX-TABLE TALLYING HEX-TALLY FOR
CHARACTERS BEFORE HEX-INPUT (1:1)
COMPUTE HEX-VALUE = HEX-TALLY * 16
MOVE 0 TO HEX-TALLY
INSPECT HEX-TABLE TALLYING HEX-TALLY FOR
CHARACTERS BEFORE HEX-INPUT (2:1)
ADD HEX-TALLY TO HEX-VALUE
MOVE FUNCTION CHAR (HEX-VALUE + 1) TO HEX-NUM
STOP RUN
.
两个字符3C
转换为单个字符,值为X"3C"。
上面的代码还有一个替代方法。我之前没有 post 因为序数值和字母可能会混淆;但是,由于您在评论中提出了这个问题,....
在下文中,hex2val
和val2hex
使用仅包含十六进制字符的有限字母表。因为它们限制了字母表,所以它们必须作为单独编译的程序调用,而不是复制到任何其他程序中,例如执行过程或嵌套程序。
hex2val
将两个字符的十六进制数据项转换为其等效的数值。
val2hex
将数值转换为其等效的两个字符的十六进制数据项。
注意:- 1
和 + 1
分别与 ORD
和 CHAR
函数一起使用。必需,因为 "0"
是有限字母表中的第一个字符 (CHAR (1)
)。
program-id. hex2val.
environment division.
configuration section.
object-computer. computer-name-here
sequence hex-digits
.
special-names.
alphabet hex-digits
"0" thru "9" "A" thru "F"
.
data division.
linkage section.
01 hex-in pic xx.
01 hex-value comp pic 9(4).
procedure division using hex-in hex-value.
begin.
compute hex-value =
(function ord (hex-in (1:1)) - 1) * 16
+ (function ord (hex-in (2:1)) - 1)
exit program
.
end program hex2val.
program-id. val2hex.
environment division.
configuration section.
object-computer. computer-name-here
sequence hex-digits
.
special-names.
alphabet hex-digits
"0" thru "9" "A" thru "F"
.
data division.
linkage section.
01 hex-value comp pic 9(4).
01 hex-out pic xx.
procedure division using hex-value hex-out.
begin.
move function char ( hex-value / 16 + 1 )
to hex-out (1:1)
move function char (
( function mod (hex-value 16)) + 1 )
to hex-out (2:1)
exit program
.
end program val2hex.
请注意,一些名称已更改,但较早的程序可以简化为 CALL
和 MOVE
。附加代码显示调用配套程序。
data division.
working-storage section.
1 hex-in pic xx value "3C".
1 hex-out pic xx value " ".
1 hex-char pic x.
1 hex-value comp pic 9(4).
procedure division.
begin.
call "hex2val" using hex-in hex-value
move function char (hex-value + 1) to hex-char
call "val2hex" using hex-value hex-out
display hex-out
stop run
.