【问题标题】:How to base64 encode in ascii如何在 ascii 中进行 base64 编码
【发布时间】:2021-04-12 18:47:42
【问题描述】:

我需要在 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                                                                        

【问题讨论】:

    标签: rpgle


    【解决方案1】:

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

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

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

    【讨论】:

    • apr_base64_xxxxx_binary 让我有点困惑。他们特别提到了 EBCDIC 字符串。如果您已经获得 ASCII 数据,我想知道它们是否是正确的例程。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      好吧,终于找到东西了……

      来自Apache docs

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-09-05
        • 2011-10-18
        • 1970-01-01
        • 1970-01-01
        • 2011-04-16
        • 2019-12-15
        • 2017-11-11
        • 2012-10-26
        相关资源
        最近更新 更多