S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

突发的 XX Encoding

Posted on 2010-06-19 10:34 S.l.e!ep.¢% 阅读(1582) 评论(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",  ":");
}

好困,下午还要陪人逛街!!!!!!!!!睡觉去~

Feedback

# re: 突发的 XX Encoding  回复  更多评论   

2010-06-19 12:36 by shbooom
XML?

# re: 突发的 XX Encoding  回复  更多评论   

2010-06-19 23:16 by 陈梓瀚(vczh)
XML!

# re: 突发的 XX Encoding  回复  更多评论   

2010-06-20 11:10 by S.l.e!ep.¢%
XML会增加报文大小
程序里要增加XML解析库
XML解析起来费多一些时间

由于以上三种原因,我没用XML

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理