如何在ascii中进行base64编码

How to base64 encode in ascii

我需要从 RPGLE 程序中以 ascii 模式进行一些 base64 编码。下面是我尝试的一个精简程序。该程序使用 QSYSDIR/QAXIS10HT 服务程序中的 apr_base64_encode_binary 过程来执行编码。它尝试编码的字段 (myPlainData) 的值为 'Hello'。该字段的 ccsid 为 819 (ascii),我需要编码结果也为 ascii。但是 apr_base64_encode_binary 将编码结果保存在 EBCDIC 中 return。有没有办法得到 ASCII 格式的结果?

  * play variables                                                                    
 D myPlainData     s            200    ccsid(819)                                     
 D myPlainDataLen...                                                                  
 D                 s             10I 0                                                
 D myBase64Data    s          65535A   ccsid(819)                                     
 D myBase64DataLen...                                                                 
 D                 s             10I 0                                                
                                                                                      
  * ibm base 64 encoder                                                               
  * note: apr_base64_* functions can be found in the QSYSDIR/QAXIS10HT service program
 D apr_base64_encode_binary...                                                        
 D                 pr            10i 0 extproc('apr_base64_encode_binary')            
 D  piBase64Data...                                                                   
 D                            65535A   options(*varsize) ccsid(819)                   
 D  piPlainData...                                                                    
 D                            65535A   options(*varsize) const                        
 D  piPlainDataLen...                                                                 
 D                               10i 0 value                                          
                                                                                    
  /free                                                                             
                                                                                    
     myPlainData = 'Hello';      // myPlainData is a ccsid(819) field (ascii field) 
     myPlainDataLen  = %len(%trimr(myPlainData));                                   
     //encode the data                                                              
     myBase64DataLen = apr_base64_encode_binary(myBase64Data                        
                                              :myPlainData                          
                                              :myPlainDataLen);                     
                                                                                    
                                                                                    
    *inlr = *on;                                                                    
   /end-free                                                                        

如果我将我的代码更改为以下,它就可以工作。这段新代码创建一个临时的 myPlainData2 字段,将其基指针分配给 myPlainData 字段,并使用此临时字段调用编码器。

  * play variables                                                                     
 D myPlainData     s            200    ccsid(819)                                      
 D myPlainDataLen...                                                                   
 D                 s             10I 0                                                 
 D myBase64Data    s          65535A                                                   
 D myBase64DataLen...                                                                  
 D                 s             10I 0                                                 
 D myPlainData2    s            200    based(myPlainData2_p)                           
                                                                                       
  * ibm base 64 encoder                                                                
  * note: apr_base64_* functions can be found in the QSYSDIR/QAXIS10HT service program 
 D apr_base64_encode_binary...                                                         
 D                 pr            10i 0 extproc('apr_base64_encode_binary')             
 D  piBase64Data...                                                                    
 D                            65535A   options(*varsize)                               
 D  piPlainData...                                                                     
 D                            65535a   options(*varsize)                               
 D  piPlainDataLen...                                                                  
 D                               10i 0 value                                         
                                                                                     
  /free                                                                              
                                                                                     
     myPlainData = 'Hello';      // myPlainData is a ccsid(819) field (ascii field)  
     myPlainDataLen  = %len(%trimr(myPlainData));                                    
     myPlainData2_p = %addr(myPlainData);                                            
     //encode the data                                                               
     myBase64DataLen = apr_base64_encode_binary(myBase64Data                         
                                               :myPlainData2                         
                                               :myPlainDataLen);                     
                                                                                     
    *inlr = *on;                                                                     
   /end-free                                                                         

您的原型的第二个参数没有 CCSID 关键字,因此它默认为作业 CCSID。当您为第二个参数传递 CCSID(819) 字段时,编译器会将其转换为作业 CCSID。

您的解决方法起作用的原因是编译器现在认为第二个参数已经在作业 CCSID 中,因此不必转换它。

我认为如果将 CCSID(819) 添加到第二个参数,您的第一个程序将正常运行。

好的,终于找到东西了...

来自Apache docs

apr_base64_encode - Encode a text string using base64encoding. On EBCDIC machines, the input is first converted to ASCII.

apr_base64_encode_binary - Encode an text string using base64encoding. This is the same as apr_base64_encode() except on EBCDIC machines, where the conversion of the input to ASCII is left out.

所以我同意芭芭拉的回答,即您应该在两个过程文本参数中都包含 CCSID(819)