0

此函数 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;
}
4

5 回答 5

0

如果字符串不为空,则可以在添加字符之前在循环中添加一个检查,然后添加一个空格。喜欢:

for (...)
{
    if (!s.empty())
        s += ' ';
    ...
}
于 2013-09-19T11:51:15.827 回答
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;
}
于 2013-09-19T11:55:24.457 回答
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它把它应用到整个向量上,用 myinfix_ostream_iterator和 astd::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();
}

另请注意,这不是修改现有字符串,而是创建并返回一个新字符串。至少在我看来,修改现有字符串是一个糟糕的主意——简单地生成一个字符串会更干净、更模块化。如果调用者想将结果组合成一个较长的字符串,那很好,但最好让低层函数干净地做一件事,让高层函数决定如何处理结果。

于 2013-09-19T12:44:15.450 回答
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;
}
于 2013-09-19T12:45:14.180 回答
0

使用boost::trim 文档

boost::trim(your_string);
于 2013-09-19T13:16:58.887 回答