在发送带有签名数据时,使用snprintf格式化数据,发现签名数据有时候有漏掉的情况
如下:
char AuthBidirection[320] = { '\0' }; 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] = { '\0' }; 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 sign1 memcpy(AuthBidirection + strlen(AuthBidirection), sign1.c_str(), sign1.size()); //added " end strcat(AuthBidirection,"\"");
使用memcpy替代
原因:经过签名后的数据,放入类型为std::string的sign的数据有可能会遇到\0的字符,然后,然后,然后。。。,往sprintf里面放的时候,自然后面的数据就漏掉了。。。。。。
单独拎出来验证一下:
char *buf = new char[5]; memcpy(buf,(void *)"abc\0d", 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] = { '\0' }; snprintf(AuthBidirection, 320, "strSig=%s", strSig.c_str()); std::cout << AuthBidirection[11] << std::endl; //打印空字符,因为没有放进去,后面都是空的 char AuthBidirection1[320] = { '\0' }; 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大小,特别是涉及网络发包时,要格外注意,避免漏掉数据
因为在使用string时,很容易就会碰到一些字符串处理函数如snprintf等等,而字符串处理的函数都是以\0为结束标记来处理的,所以需要谨慎再三,以前也有遇到过,所以此次才能一眼看出问题,记录一下,避免遗忘
来源:https://www.cnblogs.com/leehm/p/12144345.html