首页 > 解决方案 > 如何在 RPGLE 中将字符串与换行符连接起来?

问题描述

对于 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 不匹配。使用没有换行符的字符串进行测试时,一切正常。

标签: stringrpgle

解决方案


在回答你的问题...

假设您正在使用英语系统 EBCDIC CCSID 37,那么您希望使用 EBCDICx'0d'进行回车和x'25'换行。

这些值将分别转换为 ASCII CRx'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 请求的内容。


推荐阅读