如何将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
相关产品推荐
相关产品推荐

