我正在执行以下代码,请阅读:
#include <iostream>
#include <boost/format.hpp>
#include <boost/algorithm/string.hpp>
struct CharacterEscaper
{
template<typename FindResultT>
std::string operator()(const FindResultT& Match) const
{
std::string s;
for (typename FindResultT::const_iterator i = Match.begin();i != Match.end();i++)
{
s += str(boost::format("\\x%02x") % static_cast<int>(*i));
}
return s;
}
};
int main (int argc, char **argv)
{
std::string s("start\x0aend");
boost::find_format_all(s, boost::token_finder(!boost::is_print()), CharacterEscaper());
std::cout << s << std::endl;
return 0;
}
我得到的输出是:
start\xffffffaend
我期待以下内容:
start\x0aend
读过这个:
http://en.cppreference.com/w/cpp/language/escape
什么是正确的?
答案 0 :(得分:1)
这里有两个问题:
int
。这意味着,如果char
已签名,则0x7f
以上的值将进行符号扩展,从而在输出中提供额外的f
s。您可以先修改为unsigned char
,然后转换为unsigned
或int
来解决此问题。 (我不太了解Boost格式化程序知道第二次转换是否必要。)\x0ae
。解决这个问题的一种方法是将字符串文字分解为两个,这将在编译期间重新组合:"start\x0a" "end"
答案 1 :(得分:0)
我想我有答案。我应该写这个:"start\x0a" "end"