binary - 在 COBOL 中与 Pic X 数据执行二进制 OR

标签 binary cobol flags

我定义了许多标志(由远远超出我控制范围的头文件),如下所示:

  *
  * OPTVAL field for IPV6_ADDR_PREFERENCES_FLAGS
  *
   01 IPV6-ADDR-PREFERENCES-FLAGS PIC X(4).
  *
  * IPV6_ADDR_PREFERENCES_FLAGS mappings
  *
   77 IPV6-PREFER-SRC-HOME        PIC X(4) VALUE X'00000001'.      
   77 IPV6-PREFER-SRC-COA         PIC X(4) VALUE X'00000002'.      
   77 IPV6-PREFER-SRC-TMP         PIC X(4) VALUE X'00000004'.      
   77 IPV6-PREFER-SRC-PUBLIC      PIC X(4) VALUE X'00000008'.      
   77 IPV6-PREFER-SRC-CGA         PIC X(4) VALUE X'00000010'.
   77 IPV6-PREFER-SRC-NONCGA      PIC X(4) VALUE X'00000020'.

我需要对其中一些标志执行二进制或,我想知道是否有一种我不知道的简单方法可以做到这一点。是否有一个简单的关键字或语法可以使我的程序将这些标志视为二进制值并让我进行数学计算,或者这个头文件完全损坏了?

最佳答案

我认为这个库写得不好。如果您要编写一个供 COBOL 使用的低级库,您应该选择 COBOL 更容易操作的数据类型。在这种情况下,代表长字(S9(9) COMP)的 COMP 项对于 COBOL 来说会更容易处理。

假设您将这些值进行“或”运算以调用较低级别的库,则只需将它们加在一起即可获取标志值。这是可行的,因为每个常量都有一个位集。

您可以将常量移动到临时重定义区域,或者利用 COBOL 缺乏类型安全的优势并将它们传递给子程序进行操作。以下内容适用于 VMS COBOL:

IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLEOR.
DATA DIVISION.
WORKING-STORAGE SECTION.
*
* OPTVAL field for IPV6_ADDR_PREFERENCES_FLAGS
*
 01 IPV6-ADDR-PREFERENCES-FLAGS PIC X(4).
*
* IPV6_ADDR_PREFERENCES_FLAGS mappings
* 
 77 IPV6-PREFER-SRC-HOME        PIC X(4) VALUE X'00000001'.      
 77 IPV6-PREFER-SRC-COA         PIC X(4) VALUE X'00000002'.      
 77 IPV6-PREFER-SRC-TMP         PIC X(4) VALUE X'00000004'.      
 77 IPV6-PREFER-SRC-PUBLIC      PIC X(4) VALUE X'00000008'.      
 77 IPV6-PREFER-SRC-CGA         PIC X(4) VALUE X'00000010'.
 77 IPV6-PREFER-SRC-NONCGA      PIC X(4) VALUE X'00000020'.

PROCEDURE DIVISION.
1.
    CALL "BINARYOR" 
        USING IPV6-PREFER-SRC-HOME
              IPV6-PREFER-SRC-COA    
              IPV6-ADDR-PREFERENCES-FLAGS.
    CALL "BINARYOR" 
        USING IPV6-PREFER-SRC-PUBLIC
              IPV6-ADDR-PREFERENCES-FLAGS
              IPV6-ADDR-PREFERENCES-FLAGS.

    IF IPV6-ADDR-PREFERENCES-FLAGS NOT = X'0000000B'
        DISPLAY "Failure"
    END-IF.

END PROGRAM SAMPLEOR.

IDENTIFICATION DIVISION.
PROGRAM-ID. BINARYOR.

DATA DIVISION.
WORKING-STORAGE SECTION.

LINKAGE SECTION.
 01     ARG1        PIC S9(9) COMP.
 01     ARG2        PIC S9(9) COMP.
 01     RESULT      PIC S9(9) COMP.

PROCEDURE DIVISION USING ARG1 ARG2 RESULT.
1. 
    ADD ARG1 TO ARG2 GIVING RESULT.
END PROGRAM BINARYOR. 

如果这不起作用,那么您需要研究 COBOL 平台的二进制项表示,以找出正确的类型。

我在 COBOL 中做了很多(可能太多了)较低级别的事情(几十年前)。通常,你可以解决它。但到了某个时候,它就变得太难了,不值得这么麻烦。在这一点上,调用一种更适合处理位的语言(如 C)是值得的。

关于binary - 在 COBOL 中与 Pic X 数据执行二进制 OR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1045449/

相关文章:

c# - 将十六进制字符串转换为二进制字符串 C#

python - 有没有更好的方法在 python 中从十进制转换为二进制?

python - 从USB端口获取二进制数据

android - 打算开始 Activity - 但不要放在前面

assembly - 二进制减法,进位位未设置?

Android - 如何在 Activity 更改之间停止动画

c++ - 我们可以像在 C++ 中一样使用十六进制字节和字符吗?

sql-server - 有没有办法从 z/OS 大型机访问 Sql 服务器并在 IBM 3270 终端仿真中得到结果?

cobol - 如何摆脱字符串中的尾随和嵌入空格?

windows - 无需访问大型机即可学习 COBOL