字符串的十六进制转义编码是将原始字符串每个字节转换为xNN形式的C风格转义序列,如'A'→"A"、' '→" ";需遍历unsigned char并用std::hex+std::setw(2)格式化,避免符号扩展和非法单字符转义。

什么是字符串的十六进制转义编码
就是把原始字符串中每个字节(尤其是不可见字符或非 ASCII 字符)转换成 xNN 形式的转义序列,比如 'A' 变成 "A",'
' 变成 "
"。这不是 URL 编码,也不是 Base16,而是 C/C++ 源码中合法的字符串字面量写法。
用 std::ostringstream + std::hex 手动拼接
标准库没有现成函数做这个转换,得自己遍历每个 unsigned char 并格式化。关键点是必须把 char 转为 unsigned char 再转整数,否则负值会扩展出错(比如 ÿ 在有符号 char 下是 -1,直接转 int 会变成 0xffffffff)。
实操建议:
- 用
static_cast<unsigned char>(c)</unsigned>确保字节值在 0–255 范围内 - 用
std::setw(2)和std::setfill('0')补零,避免出现" "这种非法形式(C++ 要求两位十六进制) - 注意
std::hex是流状态,记得重置,或每次单独构造流
std::string hex_escape(const std::string& s) {
std::ostringstream oss;
for (unsigned char c : s) {
oss << "\x" << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(c);
}
return oss.str();
}处理空字符 ' ' 和多字节编码时的陷阱
如果输入字符串含 ' ',转换后得到 "\x00" 是合法的,但后续若用它初始化 C 风格字符串(如 const char* p = ...),strlen(p) 仍会在第一个