Convertion 8 bits -> base64

BoTTom |
      **********************************************************************
      *                                                                    *
      *  Codification BASE64 d'une chaine en RPG.                          *
      *   (par exemple 'volubis' devient 'pZaTpIKJog==')                   *
      *                                                                    *
      *   en V7, SF99701 level 23 propose aussi SYSTOOLS.BASE64Encode)     *
      *                                                                    *
      **********************************************************************
     Dptr7             S               *
     Dascii7           DS             3    based(ptr7)
     D C1                             1
     D C2                             1
     D C3                             1
 
     Dptr64            S               *
     Dbase64           DS             4    based(ptr64)
     D b1                             1
     D b2                             1
     D b3                             1
     D b4                             1
 
     Dbinasciic        DS
     D binascii                       3u 0 inz
     D binbase64       S              3u 0
 
     d boucle          S             10I 0
     d boucler         S             10I 0
     d b               S             10I 0
     D nbyte           S             10U 0 Inz(57)
     Dcode64           S              1    dim(64) ctdata perrcd(64)
     D reste           S              5I 0
     D wtemp           S              5I 0
     D bufferI         S             57A
     D bufferO         S             78A
 
     C     *entry        plist
     C                   parm                    BufferI
     C                   parm                    BufferO
      //
      // BASE64 , utilisé à l'origine pour les pièces attachées de mail
      //          chaque ligne doit être composée de 76 C maxi
      //          et ce pour chaque série de 57c en entrée
      //           puisque il faut tranformer chaque groupe de 3c
      //                                           en série de 4c.


|
      //
      /FREE
       ptr7  = %addr(BufferI);
       ptr64 = %addr(BufferO);
 
       nbyte = %len(%trimr(BuFferI));
       boucle = %div(nbyte : 3);
       boucler = %rem(nbyte : 3);
       if boucler > 0;
         boucle = boucle + 1;
       endif;
 
       for B = 1 to boucle;
         exsr SRbase64;
         ptr7  = ptr7 + 3;
         ptr64 = ptr64 + 4;
       endfor;
       *inLR = *on;
       //
       // On passe un groupe de trois caractères en quatres caractères base 64
       //
       //
       //  Exemple soit "GIF" en ascii
       //
       //               ==> x'717370'
       //
       //               ==> ! 01 00 01 11 ! 01 00 10 01 ! 01 00 01 10 !
       //                   -------------------------------------------
       //
       //  il faut générer     x'17'       x'52'      x'37'      x'06'
       //                   ! 01 00 01 ! 11 01 00 ! 10 01 01 ! 00 01 10 !
       //                   ---------------------------------------------
       //
       //  c'est à dire  (chaque octet physique faisant toujours 8 bits)
       //
       //            ! 00 01 00 01 ! 00 11 01 00 ! 00 10 01 01 ! 00 01 10 !
       //            ------------------------------------------------------
       //
       //  pour cela soit "GIF" = C1C2C3 et il faut produire B1B2B3B4
       //
       //   c1  / 4    =  b1 (01 00 01) reste 11
       //
       //   reste X 16 =  w  (11 00 00)
       //   c2  / 16   =  b2 (   01 00)    reste 10 01


|
       //   b2 + w     =  b2 (11 01 00)
       //
       //   reste X  4  = w  (10 01 00)
       //   c3  / 64    = b3 (      01)    reste 00 01 10
       //   b3 + w      = b3 (10 01 01)
       //   b4          = reste
       //
       //
       //
       begsr SRbase64;
         // 1er octet base 64 = bits 123456 du 1er caractère
         binasciic = C1;
         binbase64 = %div(binascii : 4);
         reste = %rem(binascii : 4);
         b1 = code64(binbase64 + 1);
         // 2è octet base 64 =  bits 78 du 1er caractère et reste à 0
         //  si dernier groupe = 1 octet
         wtemp = reste * 16;
         if b = boucle and boucler = 1;
              binbase64 = wtemp;
              b2 = code64(binbase64 + 1);
              b3 = '=';
              b4 = '=';
         else;
           // sinon
           // 2è octet base 64 =  bits 78 du 1er caractère et 1234 du 2è
           binasciic = C2;
           binbase64 = %div(binascii : 16);
           reste = %rem(binascii : 16);
           binbase64 += wtemp;
           b2 = code64(binbase64 + 1);
           // 3è octet base 64 =  bits 5678 du 1er caractère et reste à 0
           //  si dernier groupe = 2 octets
           wtemp = reste * 4;
           if b = boucle and boucler = 2;
             binbase64 = wtemp;
             b3 = code64(binbase64 + 1);
             b4 = '=';
           else;
             // 3è octet base 64 =  bits 5678 du 2è caractère et 12 du 3è
             binasciic = C3;
             binbase64 = %div(binascii : 64);
             reste = %rem(binascii : 64);
             binbase64 += wtemp;


|
             b3 = code64(binbase64 + 1);
             // 4è octet base 64 =  bits 345678 du 3è
             b4 = code64(reste + 1);
           endif;
         endif;
       endsr;
      /END-FREE
**
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/




©AF400