利用stringstream转换到16进制字符串,clear()避坑指南

本人在做一串原始数据,把每个字节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
问题解决!!

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值