星期一, 11月 06, 2023

2005-04-17 如何於 RPG 中取得一個字串 的 XOR 值?


如何於 RPG 中取得一個字串 的 XOR 值?

由於現今線上交易頻繁, 時常需要將訊息加以確認無誤, 
會使用一些方法, 其中一般較常使用的是 XOR, V5R2 
才開始有內建函數 %bitxor 功能, V5R2以前需要使用 _XORSTR MI 函數. 

內建函數 %bitxor 取得一個字串 的 XOR 值

File  : QRPGLESRC
Member: XORR
Type  : RPGLE
Usage : CRTBNDRPG XORR
OS : V5R2

     h debug

      * Work fields

     d length          s             10u 0 inz(1)
     d len             s             10u 0
     d idx             s             10u 0
     d inpSrc          s            256A
     d result          s              1a

     c     *entry        plist
     c                   parm                    inpSrc
     c                   parm                    result

     C                   eval      len = %len(%trimR(inpSrc))
     c                   eval      result = %subst(inpSrc:1:1)
     c                   for       idx = 2 to len
     c                   eval      result = %bitxor(
     c                                         result:
     c                                         %subst(inpSrc:idx:1)
     c                                      )
     c                   endfor

     c                   eval      *inLr = *on
     
 
 
 利用 MI _XORSTR 來取得一個字串 的 XOR 值    
 
 下述範例為利用 MI _XORSTR 來產生 XOR 值, 你可以看 dump 報表中 resultWrk 的值.

File  : QRPGLESRC
Member: XORSTRR
Type  : RPGLE
Usage : CRTBNDRPG XORSTRR
OS    : all

     h bnddir('QC2LE') debug dftactgrp(*no)

     D
     d xorstr          pr                  extproc('_XORSTR')
     d  resultWrk@                     *   value
     d  op1Wrk@                        *   value
     d  op2Wrk@                        *   value
     d  lenWrk@                      10u 0 value

     d operand         s              1

      * Work fields
     d length          s             10u 0 inz(1)
     d len             s             10u 0
     d idx             s             10u 0
     d op1             s                   like(operand)
     d op2             s                   like(operand)
     d result          s                   like(operand)
     d resultwrk       s                   like(operand)

     d op1@            s               *
     d op2@            s               *
     d resultwrk@      s               *
     d inpSrc          s            256A


     c                   eval      inpSrc = X'00' + '1234567890'
     c                   eval      op1@       = %addr(inpSrc)
     c                   eval      resultWrk@ = %addr(resultWrk)

     c                   eval      len = %len(%trimr(inpSrc))

     c                   for       idx = 1 to (len-1)
     c                   eval      op2@       = %addr(inpSrc) + idx
     c                   callp     xorstr(resultWrk@: op1@: op2@ : length)
     c                   eval      op1@ = resultWrk@
     c                   dump
     c                   endfor

     c                   eval      *inLr = *on    



沒有留言: