如何使用 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 因为序数值和字母可能会混淆;但是,由于您在评论中提出了这个问题,....

在下文中,hex2valval2hex使用仅包含十六进制字符的有限字母表。因为它们限制了字母表,所以它们必须作为单独编译的程序调用,而不是复制到任何其他程序中,例如执行过程或嵌套程序。

hex2val 将两个字符的十六进制数据项转换为其等效的数值。

val2hex 将数值转换为其等效的两个字符的十六进制数据项。

注意:- 1+ 1 分别与 ORDCHAR 函数一起使用。必需,因为 "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.

请注意,一些名称已更改,但较早的程序可以简化为 CALLMOVE。附加代码显示调用配套程序。

   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
       .