如何在ascii中进行base64编码

问题描述

我需要在 RPGLE 程序中以 ascii 模式进行一些 base64 编码。以下是我尝试的精简程序。该程序使用 qsysDIR/QAXIS10HT 服务程序中的 apr_base64_encode_binary 过程来执行编码。它尝试编码的字段 (myPlainData) 的值为“Hello”。该字段的 ccsid 为 819 (ascii),我还需要编码结果为 ascii。但是 apr_base64_encode_binary 一直在 EBCDIC 中返回编码结果。有没有办法得到 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                                                                        

解决方法

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

您的解决方法有效的原因是编译器现在认为第二个参数已在作业 CCSID 中,因此不必对其进行转换。

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

,

如果我将代码更改为以下代码,它会起作用。这段新代码创建了一个临时 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                                                                         
,

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

来自Apache docs

apr_base64_encode - 使用 base64encoding 对文本字符串进行编码。在 EBCDIC机器,输入先转换成ASCII。

apr_base64_encode_binary - 使用 base64encoding 对文本字符串进行编码。 除了在 EBCDIC 机器上,这与 apr_base64_encode() 相同, 其中省略了输入到 ASCII 的转换。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...