1

これは、HEX 文字列を受け取り、それを同等の ASCII 文字に変換する c++ の関数です。

string HEX2STR (string str)
{
    string tmp;
    const char *c = str.c_str();
    unsigned int x;
    while(*c != 0) {
        sscanf(c, "%2X", &x);
        tmp += x;
        c += 2;
    }
    return tmp;

次の文字列を入力した場合:

537461636b6f766572666c6f77206973207468652062657374212121

出力は次のようになります。

Stackoverflow is the best!!!

この関数に 1,000,000 個の一意の HEX 文字列を入力するとします。計算には時間がかかります。

これを完了するためのより効率的な方法はありますか?

4

5 に答える 5

5

もちろん。一度に 2 文字を検索します。

unsigned char val(char c)
{
    if ('0' <= c && c <= '9') { return c      - '0'; }
    if ('a' <= c && c <= 'f') { return c + 10 - 'a'; }
    if ('A' <= c && c <= 'F') { return c + 10 - 'A'; }
    throw "Eeek";
}

std::string decode(std::string const & s)
{
    if (s.size() % 2) != 0) { throw "Eeek"; }

    std::string result;
    result.reserve(s.size() / 2);

    for (std::size_t i = 0; i < s.size() / 2; ++i)
    {
        unsigned char n = val(s[2 * i]) * 16 + val(s[2 * i + 1]);
        result += n;
    }

    return result;
}
于 2013-02-15T20:41:05.890 に答える
2

とにかく書いたので、これはかなり効率的なはずです:)

const char lookup[32] =
     {0,10,11,12,13,14,15,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0};

std::string HEX2STR(std::string str)
{
  std::string out;
  out.reserve(str.size()/2);

  const char* tmp = str.c_str();

  unsigned char ch, last = 1;
  while(*tmp)
  {
    ch <<= 4;
    ch |= lookup[*tmp&0x1f];
    if(last ^= 1) 
      out += ch;
    tmp++;
  }
  return out;
}
于 2013-02-15T21:09:46.700 に答える
0

sscanfは使用しないでください。これは非常に一般的な柔軟な機能です。つまり、これらすべてのユースケースを許可するには時間がかかります。代わりに、文字列を歩き、各文字を自分で変換する方がはるかに高速です。

于 2013-02-15T20:38:35.813 に答える
0

hexToString() 関数は、16 進文字列を ASCII 読み取り可能な文字列に変換します。

string hexToString(string str){
    std::stringstream HexString;
    for(int i=0;i<str.length();i++){
        char a = str.at(i++);
        char b = str.at(i);
        int x = hexCharToInt(a);
        int y = hexCharToInt(b);
        HexString << (char)((16*x)+y);
    }
    return HexString.str();
}

int hexCharToInt(char a){
    if(a>='0' && a<='9')
        return(a-48);
    else if(a>='A' && a<='Z')
        return(a-55);
    else
        return(a-87);
}
于 2014-09-18T22:54:26.027 に答える