string - 如何在 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 不匹配。使用没有换行符的字符串进行测试时,一切正常。
解决方案
在回答你的问题...
假设您正在使用英语系统 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 请求的内容。
推荐阅读
- mysql - MySQL Query,插入时出现重复问题
- apache-spark - 在 Spark 中加载 parquet 文件后出现奇怪的数据倾斜
- python - 在docker中从requirement.txt构建图像时出错
- python - 如何将字符串列表转换为字典列表?
- mongodb - 如何提供 mongoSQLd 身份验证失败 ERROR 1043 (08S01)
- python - pyobjus nameerror:安装期间未定义名称'build_ext'
- asp.net-core - 是否可以通过 IIS 从 ASP.NET Core 强制返回 Connection 标头?
- c# - 如何在二维数组中搜索单词和替换
- python-3.x - 在 cython 安装期间找不到 Pgen 模块
- aem - 从 Author AEM6.5 以编程方式访问 AEM Publish Server