代码之家  ›  专栏  ›  技术社区  ›  Jax

使用pic x数据执行二进制或COBOL

  •  3
  • Jax  · 技术社区  · 16 年前

    我定义了许多标志(由我控制范围之外的头文件定义),这些标志如下所示:

      *
      * 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'.
    

    我需要执行一个二进制代码或者在其中一些标志上执行,我想知道是否有一种简单的方法可以做到这一点,我不知道。是否有一个简单的关键字或语法会导致我的程序将这些标志作为二进制值处理,并让我进行数学运算,或者这个头文件是完全断开的?

    3 回复  |  直到 15 年前
        1
  •  3
  •   Dave Smith    16 年前

    我认为这个图书馆写得不好。如果要编写一个低级库供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),它更适合于旋转位。

        2
  •  0
  •   Shivakumar Bhagirathan    16 年前

    二进制操作可以使用comp执行。COBOL中的comp字段应该保存二进制值。在COBOL中,当我们使用caluclate或do操作时,使用二进制comp字段是最可取的。comp是二进制格式,可以容纳半个字或全个字(即长度为2字节或4字节)。这与汇编程序定义H或F中的变量非常相似,H或F代表半个或全个字,转换为2字节或4字节。因此,当执行数学运算时,最好使用comp,然后移到字母数字字段。

        3
  •  0
  •   Developer    15 年前

    您可以使用四个pic 1(8)二进制字段(假定为32位字操作),将ipv6项移到这些字段中,然后执行二进制操作,或者选择要操作的单个位,如果可用,pic 1将发生8次。