如何在RPGLE中用换行符连接字符串?

时间:2019-04-01 08:13:32

标签: string rpgle rpg

对于Rest API,我必须连接由换行符分隔的字符串。此字符串用于HMAC计算。

我已经尝试过使用不同的十六进制值作为分隔符,例如x'25'x'13'x'10',但是没有提供预期的HMAC。

// working PHP example

//

// variables

$method = "POST";

$uri = "https://www.real.de/api/v1/units/";  

$body = "";

$timestamp = 1411055926;

$secretKey = "a7d0cb1da1ddbc86c96ee5fedd341b7d8ebfbb2f5c83cfe0909f4e57f05dd403";

// 

function signRequest($method, $uri, $body, $timestamp, $secretKey)
{

$string = implode("\n", [ $method, $uri, $body, $timestamp, ]);

return hash_hmac('sha256', $string, $secretKey);

}

// expected HMAC 

// 75312eabe66e4b9e74552a5e8959456d69cfa52a7cae9049093aede4bcdf71e7

// code RPGLE

yLf = x'25';

yString = %trim(yMethod)
+ yLf
+ %trim(yUrl)
+ yLf
+ %trim(yBody)
+ yLf
+ %trim(yTima);

// the string and the secret key then are converted to ASCII 

// the HMAC is calculated by the API 'Qc3CalculateHMAC'

RPGLE生成的HMAC与预期的HMAC不匹配。使用不含换行符的字符串进行测试时,一切正常。

3 个答案:

答案 0 :(得分:0)

回答您的问题...

假设您正在使用英语系统EBCDIC CCSID 37,那么您想使用EBCDIC x'0d'用于回车,x'25'用于换行。

这些值将分别转换为ASCII CR x'0d'和LF x'0a'

但是看来您已经使用了正确的十六进制值。

如何转换为ASCII? iconv()API是最佳选择...

假设您使用的是受支持的IBM i版本...您可能能够利用RPG对CCSID支持的增强功能来隐式转换EBCDIC字符串...

dcl-s var1 char(100) ccsid(*utf8); // special value *UTF8 = CCSID 1208
dcl-s var2 char(100) ccsid(00367); // ANSI X3.4 ASCII standard; USA
dcl-s var3 char(100) ccsid(00437); // PC Data; PC Base; USA

还取决于您用于发送HTTP请求的内容。

答案 1 :(得分:0)

'\ n'是“换行符”,x'15'。

答案 2 :(得分:0)

尚未在RPG中找到解决方案,我正在从RPG调用PHP脚本作为解决方法。