base64 - 在 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;
解决方案
SQLSTATE
在 RPG 中检查或SQLCODE
运行 SQL 语句之后总是一个好主意。
如果您这样做了,您会看到,
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。
推荐阅读
- fragment - 片段的重用包含在元素中具有硬编码 id 的对话框
- php - 如何选择所有未发布的用户,按日期分组?
- r - 如何在 R 中的函数 read.table 中转义特殊字符?
- linux - auditd Syscalls - chown 和 chownat 之间的区别?
- javascript - 网络蓝牙,获取配对设备列表
- java - 打印控制台到 JFrame TextArea - 行为怪异(闪烁屏幕)
- c++ - C++ - 加载图像的 Base64 编码字符串以提升 GIL 图像/视图
- python - 如何在 Python 中形成站点之间的距离矩阵?
- javascript - Javascript使用正则表达式获取对象中间的日期
- linux - 为什么 python 程序在 Linux shell 和 Jenkins 作业之间运行结果不同