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

