如何将ASCII编码的SHA1哈希转换为hex十六进制编码格式?
实现方法
首先明确概念:你当前拿到的40字节std::string返回值,本身就是十六进制(hex)格式的ASCII可读字符串——每个字符占1字节,共40个十六进制字符,对应SHA1原生20字节的哈希结果。你需要的20字节存储,本质是把这串ASCII形式的hex字符串解码为原始二进制字节流,具体实现步骤如下:
- 先做输入合法性校验:传入的字符串长度必须等于40,否则不是合法的SHA1 hex串
- 按顺序每两个ASCII字符为一组,每组对应1字节二进制值:第一个字符转成字节的高4位,第二个字符转成字节的低4位
- 把所有组转换得到的字节按顺序拼接,最终得到的就是长度固定20字节的原始SHA1哈希值,可以直接用于存储、比对等场景
下面是无额外依赖的C++实现代码,适配你当前用的SHA1库返回小写hex串的场景:
#include <string> #include <cstdint> /** * @brief 把40字节ASCII格式的SHA1 hex字符串转为20字节原始二进制哈希 * @param hex_str SHA1库返回的40长度std::string * @return 20字节长度的原始二进制哈希结果,入参非法时返回空串 */ std::string sha1_hex_to_raw(const std::string& hex_str) { if (hex_str.length() != 40) { return std::string(); } std::string raw_hash; raw_hash.reserve(20); // 预分配固定长度空间,避免内存扩容开销 for (size_t i = 0; i < 40; i += 2) { uint8_t high = 0, low = 0; char hc = hex_str[i], lc = hex_str[i+1]; // 转换高4位 if (hc >= '0' && hc <= '9') { high = hc - '0'; } else if (hc >= 'a' && hc <= 'f') { high = 10 + (hc - 'a'); } // 转换低4位 if (lc >= '0' && lc <= '9') { low = lc - '0'; } else if (lc >= 'a' && lc <= 'f') { low = 10 + (lc - 'a'); } raw_hash.push_back(static_cast<char>((high << 4) | low)); } return raw_hash; }
注意事项
- 转换得到的20字节结果是二进制数据,包含大量不可见字符,不要直接当做文本字符串打印、拼接,否则会出现乱码
- 你当前用的SHA1库默认返回小写十六进制字符,上述代码默认适配小写输入,如果需要兼容大写A-F格式的hex串,在字符判断分支里补充大写字符的处理逻辑即可
- 如果后续需要把20字节原始哈希转回可读的40字节hex串,把每个字节拆成高4位、低4位,分别转成对应的十六进制ASCII字符拼接即可
内容的提问来源于stack exchange,提问作者lorem1213
相关产品推荐
相关产品推荐

