You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将unsigned char*类型十六进制数据转换为字符串?附HMAC-SHA256代码

我来帮你搞定这个unsigned char*转十六进制字符串的问题!先把你没写完的HMAC代码补全,再给你写核心的转换逻辑~

补全你的HMAC-SHA256函数

先把你未完成的HMAC代码补全,同时修正一些细节(比如内存分配大小、资源释放),避免内存泄漏:

#include <string>
#include <openssl/hmac.h>
#include <cstring>
#include <cstdlib>

std::string HMACsha256(std::string message, std::string APIkey){
    const char* key = APIkey.c_str();
    const unsigned char* data = reinterpret_cast<const unsigned char*>(message.c_str());
    unsigned int data_len = message.length();
    unsigned int key_len = APIkey.length();

    // SHA256的HMAC输出固定是32字节,用EVP_MAX_MD_SIZE适配所有摘要算法更通用
    unsigned char* result = static_cast<unsigned char*>(malloc(EVP_MAX_MD_SIZE));
    unsigned int result_len = 0;

    HMAC_CTX ctx;
    HMAC_CTX_init(&ctx);
    HMAC_Init_ex(&ctx, key, key_len, EVP_sha256(), NULL);
    HMAC_Update(&ctx, data, data_len);
    HMAC_Final(&ctx, result, &result_len);
    HMAC_CTX_cleanup(&ctx); // 必须清理上下文资源

    // 调用转换函数,把二进制结果转成十六进制字符串
    std::string hex_str = unsignedCharToHex(result, result_len);

    free(result); // 释放malloc分配的内存
    return hex_str;
}
实现unsigned char*到十六进制字符串的转换

核心的转换逻辑其实很简单:遍历每个字节,把它转换成两位十六进制字符(支持大小写切换):

#include <sstream>
#include <iomanip>

std::string unsignedCharToHex(const unsigned char* data, unsigned int length) {
    std::stringstream ss;
    // 配置格式:十六进制、补0填充、可选大小写(默认小写)
    ss << std::hex << std::setfill('0');
    // 如果需要大写十六进制,添加这一行:ss << std::uppercase;

    for (unsigned int i = 0; i < length; ++i) {
        // 把单字节转成int类型,再格式化输出两位十六进制
        ss << std::setw(2) << static_cast<int>(data[i]);
    }
    return ss.str();
}
几个关键注意点
  • 头文件依赖:必须包含<sstream>和<iomanip>来处理字符串流和格式控制,<openssl/hmac.h>是HMAC函数的核心头文件。
  • 内存管理:malloc分配的内存一定要用free释放,同时HMAC上下文必须用HMAC_CTX_cleanup清理,避免资源泄漏。
  • 大小写控制:如果需要大写的十六进制字符串,只需要在stringstream初始化时加上std::uppercase即可。

这样你的函数就能直接返回标准的十六进制字符串啦,测试时用已知的消息和密钥就能验证结果是否正确。

内容的提问来源于stack exchange,提问作者runesbane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:45:11