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

