在 RPGLE 程序中使用 SYSTOOLS.BASE64DECODE 时出现问题

问题描述

我正在尝试使用 SYSTOOLS.BASE64DECODE 函数sqlRPGLE 中解码 base64 字符串。结果是一个空字符串。 base64 字符串也有 CRLF 字符。当我从 base64 字符串中省略 CRLF 时,解码工作正常。看起来跟字符集有关。任何帮助表示赞赏

示例 base64 字符串: XlhBCl5GWCoqKioqKipBUEMgTG9nbyoqKioqKioqXkZTCl5GTzU4MCw

sqlRPGLE

Dcl-S VarcharField1 Varchar(4096) ;                          
Dcl-S VarcharField2 varchar(13096) inz(' ') ccsid(819);  
    
VarcharField1 = 'XlhBCl5GWCoqKioqKipBU';                     
                                                             
EXEC sql SET :VarcharField2 =                                
              SYSTOOLS.BASE64DECODE(:VarcharField1);         
                             
*InLr = *On;       

                                      

解决方法

在 RPG 中运行 SQL 语句后检查 SQLSTATESQLCODE 总是一个好主意。

如果你这样做了,你就会看到,
SQLSTATE==38000-->Java™ 例程因异常退出。

查看工作日志,有更多信息

Java stored procedure or user-defined function SYSTOOLS.BASE64DECODE,specific name BASE600002 aborted with an exception "incomplete base64 
  string: XlhBCl5GWCoqKioqKipBU".                                       

我记得,base64 编码的字符串应该是 4 的倍数,如果需要,必须用“=”填充。

但是,您提供的字符串长度为 21 个字符,这意味着 3 个无效的填充字符,您不应该需要超过 2 个。

如果你填充完整的字符串而不是子字符串,它应该可以工作。

VarcharField1 = 'XlhBCl5GWCoqKioqKipBUEMgTG9nbyoqKioqKioqXkZTCl5GTzU4MCw=';  

编辑
很好,因为没有抛出异常。觉得还是CCSID问题,我一般不使用SYSTOOLS.BASE64DECODE。

相关问答

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