问题描述
我需要在 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
,
好的,终于找到东西了...
apr_base64_encode - 使用 base64encoding 对文本字符串进行编码。在 EBCDIC机器,输入先转换成ASCII。
apr_base64_encode_binary - 使用 base64encoding 对文本字符串进行编码。 除了在 EBCDIC 机器上,这与 apr_base64_encode() 相同, 其中省略了输入到 ASCII 的转换。
所以我同意 Barbara 的回答,即您应该在两个过程文本参数中都包含 CCSID(819)
。