zoukankan      html  css  js  c++  java
  • snprintf格式化字符串遇到std::string包含的问题

    在发送带有签名数据时,使用snprintf格式化数据,发现签名数据有时候有漏掉的情况

    如下:

    char AuthBidirection[320] = { '' };
    snprintf(AuthBidirection, 320, "Bidirection algorithm="%s",random1="%s",random2="%s",deviceid="%s",serverid="%s",sign1="%s"
    ", strAlgorithm.c_str(), m_strRandom1.c_str(), strRandom2.c_str(), m_strGbID.c_str(), m_strGbServerID.c_str(), sign1.c_str());

    改为:

    char AuthBidirection[320] = { '' };
    snprintf(AuthBidirection, 320, "Bidirection algorithm="%s",random1="%s",random2="%s",deviceid="%s",serverid="%s",sign1=",
    strAlgorithm.c_str(), m_strRandom1.c_str(), strRandom2.c_str(), m_strGbID.c_str(), m_strGbServerID.c_str());
    //added ”“ to sign1
    string strTempSign1 = """ + sign1;
    strTempSign1.push_back('"');
    memcpy(AuthBidirection + strlen(AuthBidirection), strTempSign1.c_str(), strTempSign1.size());

    使用memcpy替代

    原因:经过签名后的数据,放入类型为std::string的sign的数据有可能会遇到的字符,

    然后,然后,然后。。。,sign1.c_str()返回的是一个字符数组的起始地址,往sprintf里面放的时候自然到就结束了,后面的数据就被直接漏掉了。。。。。。

    单独拎出来验证一下: 

        char *buf = new char[5];
        memcpy(buf,(void *)"abcd", 5);
        string strSig;
        strSig.assign(buf, 5);
        int len = strSig.size();
        std::cout << strSig.size() << std::endl;     //5
        std::cout << strSig[4] << std::endl;         //d
    
        char AuthBidirection[320] = { '' };
        snprintf(AuthBidirection, 320, "strSig=%s", strSig.c_str());
        std::cout << AuthBidirection[11] << std::endl;    //打印空字符,因为没有放进去,后面都是空的
    
        char AuthBidirection1[320] = { '' };
        snprintf(AuthBidirection1, 320, "strSig=%s", "");
        memcpy(AuthBidirection1 + strlen(AuthBidirection1), strSig.c_str(),len);
        std::cout << AuthBidirection1[11] << std::endl; //d

    输出:

    5
    d

    d

    最后的d一个放进去了,一个没有

    因此,在使用string进行数据处理的时候,需要特别注意size大小,特别是涉及网络发包时,要格外注意使用strSig.c_str()来处理,strSig.c_str()仅仅是一个起始地址,

    因此碰到字符串处理函数如snprintf等等,都是以为结束标记来处理的,所以需要谨慎再三。  此前也有遇到过类似,因此才能迅速发现问题,记录一下。。。。

  • 相关阅读:
    HDU1255覆盖的面积
    B. An express train to reveries
    Long Long Message(后缀数组)
    Longest Common Substring(最长公共子序列)
    最长上升子序列(NlogN)总结
    bzoj 1500 维修数列
    HDU 6357 Hills And Valleys
    牛客暑假多校第六场 I Team Rocket
    HDU 6346 整数规划 二分图匹配最优解
    牛客暑假多校第五场 I vcd
  • 原文地址:https://www.cnblogs.com/leehm/p/12144345.html
Copyright © 2011-2022 走看看