本人在做一串原始数据,把每个字节16进制输出遇见的问题
经历过程1,直接撸代码
string convertToString(const unsigned char* s_src, int len)
{
std::string str, temp(2, '0');
std::stringstream ioss;
for (int i = 0; i < len; ++i) {
ioss << std::hex << setw(2) << setfill('0') << (int)s_src[i];
ioss >> temp;
str += temp + " ";
ioss.clear();
}
return str;
}
int main()
{
unsigned char a = 1, b = 2, c = 16;
unsigned char buf[] = {a, b, c};
string str = convertToString(buf, sizeof (buf));
cout << str <<endl;
}
程序输出:
01 02 10
经历过程2
上面的写法虽然满足了工程需要,但是作为嵌入式C语言程序员出身,写代码永远是效率第一。平白无故的定义个 temp 中间字符串看着就闹心,于是:
string convertToString(const unsigned char* s_src, int len)
{
std::string str;
std::stringstream ioss;
for (int i = 0; i < len; ++i) {
ioss << std::hex << setw(2) << setfill('0') << (int)s_src[i];
str.append(ioss.str()).append(" ");
ioss.clear();
}
return str;
}
这样少了一个中间变量,本就性能不敌PC的小破arm板子,再也不用忍受创建、销毁这个临时对象的负担了。暗自窃喜之时,输出确实这样的:
01 0102 010210
明明已经clear()了 怎么是这种情况?缓存区为什么没清空?
经历过程3
经过一番面向百度编程之后,发现原来要想彻底清除stringstream的缓冲区要使用 str("")函数 在上述代码种就是得 ioss.str(""),于是出现一下代码
string convertToString(const unsigned char* s_src, int len)
{
std::string str;
std::stringstream ioss;
for (int i = 0; i < len; ++i) {
ioss << std::hex << setw(2) << setfill('0') << (int)s_src[i];
str.append(ioss.str()).append(" ");
ioss.str("");
}
return str;
}
程序输出:
01 02 10
问题解决!!