这个函数,vec2string采用char的向量并转换为十六进制字符串表示,但每个字节值之间有一个空格。只是我的应用程序中的格式要求。任何人都可以想到一种方法来消除它的需要。
std::string& vec2string(const std::vector<char>& vec, std::string& s) {
static const char hex_lookup[] = "0123456789ABCDEF";
for(std::vector<char>::const_iterator it = vec.begin(); it != vec.end(); ++it) {
s.append(1, hex_lookup[(*it >> 4) & 0xf]);
s.append(1, hex_lookup[*it & 0xf]);
s.append(1, ' ');
}
//remove very last space - I would ideally like to remove this***
if(!s.empty())
s.erase(s.size()-1);
return s;
}
答案 0 :(得分:0)
如果字符串不为空,则可以在循环中添加一个检查,然后添加一个空格。像:
for (...)
{
if (!s.empty())
s += ' ';
...
}
答案 1 :(得分:0)
std::string& vec2string(const std::vector<char>& vec, std::string& s) {
static const char hex_lookup[] = "0123456789ABCDEF";
if (vec.empty())
return s;
s.reserve(s.size() + vec.size() * 3 - 1);
std::vector<char>::const_iterator it = vec.begin();
s.append(1, hex_lookup[(*it >> 4) & 0xf]);
s.append(1, hex_lookup[*it & 0xf]);
for(++it; it != vec.end(); ++it) {
s.append(1, ' ');
s.append(1, hex_lookup[(*it >> 4) & 0xf]);
s.append(1, hex_lookup[*it & 0xf]);
}
return s;
}
答案 2 :(得分:0)
我首先将十六进制转换分成它自己的小函数:
std::string to_hex(char in) {
static const char hex_lookup[] = "0123456789ABCDEF";
std::string s;
s.push_back(hex_lookup[(in>>4) & 0xf];
s.push_back(hex_lookup[in & 0xf];
return s;
}
然后我会使用std::transform
将其应用于整个矢量,并使用infix_ostream_iterator
和std::stringstream
将这些片段组合在一起。
#include <sstream>
#include <algorithm>
#include "infix_iterator"
std::string vec2string(const std::vector<char>& vec) {
std::stringstream s;
std::transform(vec.begin(), vec.end(),
infix_ostream_iterator<std::string>(s, " "),
to_hex);
return s.str();
}
另请注意,这不是修改现有字符串,而是创建并返回一个新字符串。至少在我看来,修改现有的字符串是一个糟糕的想法 - 简单地生成一个字符串更清晰,更模块化。如果调用者想要将结果组合成一个更长的字符串,那很好,但是对于较低级别的函数来说,最好只做一件事,并让更高级别的函数决定如何处理结果。
答案 3 :(得分:0)
如果你有Boost,请使用algorithm / string / join.hpp。否则,您可以尝试Duff的设备方法:
string hex_str(const vector<char>& bytes)
{
string result;
if (!bytes.empty())
{
const char hex_lookup[] = "0123456789ABCDEF";
vector<char>::const_iterator it = bytes.begin();
goto skip;
do {
result += ' ';
skip:
result += hex_lookup[(*it >> 4) & 0xf];
result += hex_lookup[*it & 0xf];
} while (++it != bytes.end());
}
return result;
}
答案 4 :(得分:0)
使用boost::trim
documentation
boost::trim(your_string);