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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 14:36:21