在 Progress 4gl 中转换十进制值得到拆分后的二进制

Convert the decimal value to get the split binary in Progress 4gl

我必须制作一个输出如下的程序:

def var vbit as logical extent 64 initial "false".
def var x    as char    form "x(16)" /* to store the decimal input */

Input : 2220010000000000
convert the value into:

22=00100010
20=00100000
01=00000001
00=00000000
00=00000000
00=00000000
00=00000000

那么如果二进制被排序,输出将是:

123456789012345678901234
00100010001000000000000100000000000000000000000000000000

从这个二进制文件中,更改图像上的 vbit [x]。

非常感谢您的回答。

这是一个简单的示例,很可能不适用于像环境这样的生产...

据我所知,没有用于创建二进制数的内置函数或方法。所以我从这里借用了一个函数: http://knowledgebase.progress.com/articles/Article/P125416

我已将函数修改为 return 具有 4 位格式的整数,这将适用于此特定示例,但当然不适用于更大的二进制数。

DEFINE VARIABLE vbit     AS LOGICAL EXTENT 64    NO-UNDO .
DEFINE VARIABLE cString  AS CHARACTER   NO-UNDO FORMAT "x(16)".
DEFINE VARIABLE cBinary  AS CHARACTER   NO-UNDO.
DEFINE VARIABLE i        AS INTEGER     NO-UNDO.

ASSIGN 
    cString = "2220010000000000".

FUNCTION getBinary RETURNS CHARACTER (INPUT piValue AS INTEGER):

    DEFINE VARIABLE cReturn AS CHARACTER   NO-UNDO .
    DEFINE VARIABLE iReturn AS INTEGER     NO-UNDO FORMAT "9999".

    DO WHILE piValue > 0:
      ASSIGN 
         cReturn  =  STRING( piValue MOD 2 ) + cReturn
         piValue =  TRUNCATE( piValue / 2, 0 )
         .
    END.
    IF cReturn = "" THEN cReturn = "0".


    iReturn = INTEGER(cReturn).

    RETURN STRING(iReturn, "9999").

END FUNCTION.

/* Convert the string of integers into a binary format */
DO i = 1 TO LENGTH(cString):
    cBinary = cBinary + getBinary(INTEGER(SUBSTRING(cString, i, 1))).
END.

/* Move the binary numbers into the boolean variable */
DO i = 1 TO LENGTH(cBinary).

    IF SUBSTRING(cBinary, i, 1) = "1" THEN
        vbit[i] = TRUE.
    ELSE
        vbit[i] = FALSE.
END.

/* Uncomment this to output
123456789012345678901234
00100010001000000000000100000000000000000000000000000000 
*/
/*
DISP "123456789012345678901234" SKIP
    cBinary FORMAT "x(70)" WITH FRAME fr1 4 DOWN WIDTH 90.
*/

/* Display the boolean variable in the specified format */
DISP vbit WITH FRAME fr2 SIDE-LABELS 4 COLUMNS WIDTH 90 25 DOWN.