Android下如何将std::vector<BYTE>转为十六进制字符串并通过__android_log_print输出
Android平台下将std::vector转换为十六进制字符串并输出的实现方法
核心实现思路
遍历std::vector<BYTE>中的每个字节,将其格式化为0xXX的十六进制形式,拼接成空格分隔的字符串,最后通过__android_log_print输出到Android日志系统。
完整代码示例
首先确保引入必要的头文件:
#include <vector> #include <sstream> #include <iomanip> #include <android/log.h> // 若环境未定义BYTE,手动声明别名 #ifndef BYTE typedef unsigned char BYTE; #endif
方法一:使用stringstream(简洁易读)
通过C++标准库的stringstream完成格式化拼接:
std::string byteVectorToHexString(const std::vector<BYTE>& input) { std::stringstream ss; // 设置十六进制、大写格式、补零填充 ss << std::hex << std::uppercase << std::setfill('0'); for (size_t i = 0; i < input.size(); ++i) { if (i != 0) { ss << " "; // 非第一个字节前添加空格分隔 } // 强制转换为int避免BYTE被当作字符处理,setw(2)确保两位十六进制数 ss << "0x" << std::setw(2) << static_cast<int>(input[i]); } return ss.str(); }
方法二:使用snprintf(性能更优)
对于数据量较大的场景,可使用C风格的snprintf直接操作内存,减少字符串拷贝:
std::string byteVectorToHexString(const std::vector<BYTE>& input) { if (input.empty()) { return ""; } // 计算所需字符串总长度:每个字节占"0xXX "(5字符),最后一个字节无末尾空格,总长度为5*N -1 const size_t totalLength = input.size() * 5 - 1; std::string result(totalLength, '\0'); char* bufferPtr = &result[0]; for (size_t i = 0; i < input.size(); ++i) { if (i != 0) { *bufferPtr++ = ' '; } // 格式化单个字节,返回写入的字符数,移动指针 bufferPtr += sprintf(bufferPtr, "0x%02X", static_cast<unsigned int>(input[i])); } return result; }
调用与输出
在代码中调用转换函数,并通过__android_log_print输出:
// 示例输入 std::vector<BYTE> input{15, 78, 76, 32, 20}; std::string hexStr = byteVectorToHexString(input); // 输出到Android日志,LOG_TAG可自定义,日志级别按需选择(INFO/DEBUG等) __android_log_print(ANDROID_LOG_INFO, "BYTE_CONVERTER", "%s", hexStr.c_str());
关键注意事项
BYTE通常是unsigned char的别名,若项目环境未定义,需手动添加typedef unsigned char BYTE;std::setw(2)和%02X确保单个字节的十六进制表示占两位,不足时补零(如15转为0x0F而非0xF)__android_log_print的第一个参数为日志级别,常用值包括ANDROID_LOG_DEBUG、ANDROID_LOG_INFO、ANDROID_LOG_ERROR等;第二个参数为日志标签,用于过滤日志
内容的提问来源于stack exchange,提问作者abalaev
相关产品推荐
相关产品推荐

