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

Python decode('hex')的C++等效实现方案咨询

实现Python decode('hex')的C/C++等效功能

我刚好之前折腾过类似的需求,Python里的i.decode('hex')(Python 3里对应bytes.fromhex(i)再转成带转义的显示格式)核心逻辑其实分两步:把十六进制字符串逐两个字符解码成字节数组,再把字节数组按照Python的规则转换成带转义的字符串输出——可打印ASCII字符直接显示,不可打印字符用\xXX的十六进制转义格式(小写两位)。

C/C++标准库确实没有直接提供完全匹配的函数,但自己实现起来很清晰,下面分步骤给你讲:


第一步:十六进制字符串转字节数组

首先要把输入的十六进制字符串(比如"0000000000000000d0ed77c1f924ac20")转换成对应的字节数组。逻辑是每两个字符一组,把每组十六进制字符转换成一个8位字节。

这里要注意几个细节:

  • 输入字符串长度必须是偶数(Python会报错如果是奇数,我们也应该做校验)
  • 支持大小写的十六进制字符(a-f和A-F都要能识别)
  • 遇到非法字符(非十六进制字符)要报错

下面是实现代码:

#include <vector>
#include <string>
#include <cctype>
#include <stdexcept>

std::vector<uint8_t> hex_to_bytes(const std::string& hex_str) {
    // 检查长度是否为偶数
    if (hex_str.size() % 2 != 0) {
        throw std::invalid_argument("Hex string length must be even");
    }

    std::vector<uint8_t> bytes;
    bytes.reserve(hex_str.size() / 2);

    auto char_to_hex = [](char c) -> uint8_t {
        if (std::isdigit(c)) {
            return c - '0';
        } else if (std::islower(c)) {
            return 10 + (c - 'a');
        } else if (std::isupper(c)) {
            return 10 + (c - 'A');
        }
        throw std::invalid_argument("Invalid hex character");
    };

    for (size_t i = 0; i < hex_str.size(); i += 2) {
        uint8_t high = char_to_hex(hex_str[i]);
        uint8_t low = char_to_hex(hex_str[i+1]);
        bytes.push_back((high << 4) | low);
    }

    return bytes;
}

第二步:字节数组转Python风格的显示字符串

接下来要把字节数组转换成和Python完全一致的输出格式:

  • 对于ASCII可打印字符(范围0x20(空格)到0x7E(波浪号)),直接输出该字符
  • 其他字符(包括控制字符、扩展ASCII)输出\x加上两位小写十六进制数(比如0x00→\x00,0xd0→\xd0)

实现代码如下:

#include <sstream>
#include <iomanip>

std::string bytes_to_python_style_str(const std::vector<uint8_t>& bytes) {
    std::ostringstream oss;
    for (uint8_t b : bytes) {
        if (b >= 0x20 && b <= 0x7E) {
            // 可打印ASCII字符,直接输出
            oss << static_cast<char>(b);
        } else {
            // 不可打印字符,输出\xXX格式
            oss << "\\x" << std::hex << std::setw(2) << std::setfill('0') 
                << static_cast<int>(b);
            // 恢复默认格式,避免后续输出受影响
            oss << std::dec << std::setfill(' ') << std::setw(0);
        }
    }
    return oss.str();
}

完整测试示例

把两个函数结合起来,测试你给出的输入:

#include <iostream>

int main() {
    try {
        std::string hex_str = "0000000000000000d0ed77c1f924ac20";
        auto bytes = hex_to_bytes(hex_str);
        std::string result = bytes_to_python_style_str(bytes);
        
        std::cout << "Result: '" << result << "'" << std::endl;
        // 输出应该和Python的结果一致:'\x00\x00\x00\x00\x00\x00\x00\x00\xd0\xedw\xc1\xf9$\xac '
    } catch (const std::exception& e) {
        std::cerr << "Error: " << e.what() << std::endl;
        return 1;
    }
    return 0;
}

额外说明

如果你不想自己实现,也可以用第三方库比如Boost的boost::algorithm::unhex来完成十六进制到字节的转换,然后再自己处理转义输出部分。但如果只需要基础功能,自己实现的代码更轻量,不需要依赖第三方库。

另外要注意,Python的decode('hex')在Python 3里已经被弃用,推荐用bytes.fromhex(),但两者的解码逻辑是一致的,我们的实现完全匹配这个逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:28:45