Posted on 2010-06-19 10:34
S.l.e!ep.¢% 閱讀(1739)
評論(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",??":");
}
好困,下午還要陪人逛街!!!!!!!!!睡覺去~