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

嵌入式Linux下如何用单次printf输出string所有字符的十六进制值

解决方案:单次printf输出字符串所有字符的十六进制值

你没法直接通过printf("%X", uuid.c_str())实现需求,因为c_str()返回的是指针,这里输出的是指针的内存地址,而非字符串内容的十六进制值。要实现单次输出所有字符的十六进制,有几种可行方案:

1. 预先生成十六进制格式字符串

先把原字符串的每个字符转换为两位十六进制的字符形式,拼接成一个新的字符串,再一次性用printf输出:

#include <iostream>
#include <string>
#include <cstdio>
using namespace std;

string str_to_hex(const string& input) {
    string hex_str;
    const char* hex_digits = "0123456789ABCDEF";
    for (unsigned char c : input) {
        hex_str += hex_digits[(c >> 4) & 0xF];
        hex_str += hex_digits[c & 0xF];
    }
    return hex_str;
}

int main() {
    string uuid = "\241\242";
    string hex_output = str_to_hex(uuid);
    printf("%s\n", hex_output.c_str()); // 单次输出A1A2
    return 0;
}

2. 固定长度场景直接写死格式

如果字符串长度固定(比如示例中的2字节),直接构造对应格式串单次输出是最简单的方式:

#include <iostream>
#include <string>
#include <cstdio>
using namespace std;

int main() {
    string uuid = "\241\242";
    printf("%hhX%hhX\n", uuid[0], uuid[1]); // 直接单次输出A1A2
    return 0;
}

3. 使用C++流构建输出

如果项目允许使用C++标准流,也可以用ostringstream构建十六进制输出,再一次性打印:

#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
using namespace std;

int main() {
    string uuid = "\241\242";
    ostringstream oss;
    oss << hex << uppercase;
    for (unsigned char c : uuid) {
        oss << setw(2) << setfill('0') << static_cast<int>(c);
    }
    printf("%s\n", oss.str().c_str()); // 单次输出A1A2
    return 0;
}

说明

第一种方法是最通用且兼容性最好的,尤其适合嵌入式环境,无需依赖复杂的标准库特性,也能彻底避免日志宏导致的换行问题——因为最终是单次调用printf输出完整的十六进制字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 03:10:25