如何使用COBOL中的不同输入将十六进制转换为Ascii

问题描述

我的意图是能够从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并使用。

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”的单个字符。


上面有替代代码的方法。我之所以没有发布它,是因为序数值和字母可能会造成混淆;但是,由于您在评论中提出了这个问题,....

以下,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
       .

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...