Posted on 2010-06-19 10:34
S.l.e!ep.¢% 阅读(1728)
评论(3) 编辑 收藏 引用 所属分类:
C++
XX just a name ~
已知条件: 1. 有个很烦的客户
2. 那个很烦的客户说“你发送过来的报文,必须全是可见字符”
3. 那个很烦的客户又说“你每次发送过来的报文,必须包含的信息有 字段名 与 字段值”
4. 那个很烦的客户还说“字段名 与 字段值 必须在一个报文同时发送过来,不要分成两个报文”
5. 那个很烦的客户最后说“你不能限制我不使用某个可见字符,更不要试图来说服我”
本来报文想struct, 二进制,搞两个 int 成员, 由于 (已知条件1)杯具了
于是只能用字符串了,但由于 (已知条件3) 的缘故,我说“能不能把 字段名 和 字段值分开两个报文,然后梅花间竹地发过去?”,由于 (已知条件4) 又杯具了
后来想想,一个字符串的报文包含 字段名与字段值也没问题啊, 但你不能使用分号,因为我想用它来作为分隔符,把字段名与字段值区分开来,由于 (已知条件5),我不想活了
后来经某位有经验的人士的启发,参考了 URL编码
解决方法:就是使用 XX Encoding 了
两个转义字符
\ -> \b
: -> \c
具体代码如下:
std::string MakeString(std::string strField, std::string strValue)
{
replace_all(strField, "\\", "\\b");
replace_all(strField, ":", "\\c");
replace_all(strValue, "\\", "\\b");
replace_all(strValue, ":", "\\c");
return strField + ":" + strValue;
}
void DivideString(std::string strSrc, std::string& strField, std::string& strValue)
{
size_t pos = strSrc.find(":", 0);
strField = strSrc.substr(0, pos);
strValue = strSrc.substr(pos + strlen(":"), strSrc.length() - pos - strlen(":") );
replace_all(strField, "\\b", "\\");
replace_all(strField, "\\c", ":");
replace_all(strValue, "\\b", "\\");
replace_all(strValue, "\\c", ":");
}
好困,下午还要陪人逛街!!!!!!!!!睡觉去~