C ++:将字符串中十六进制ascii值的出现转换为普通字符

时间:2012-07-31 10:12:47

标签: c++ ascii

我有一个std :: string,其中包含正常的字母和数字,但所有标点符号(例如括号,方括号,逗号和冒号)都是ASCII表示形式(例如%28%29%2C%3A)。

解析字符串的最快方法是什么,单独保留“普通”字符并将十六进制值转换为ASCII表示形式?

3 个答案:

答案 0 :(得分:2)

您可以使用例如用于搜索'%'字符的find函数。如果接下来的两个字符是十六进制数字,则用实际字符替换三个字符。当您找到'%'时,请在循环中执行所有操作。

您可以迭代字符串,将普通字符附加到另一个字符串,然后当您到达'%'时检查它是否为有效的URL转义符,并将正确的字符附加到其中,而不是进行就地替换。输出字符串。

答案 1 :(得分:1)

libcurl具有函数curl_easy_unescape

char *curl_easy_unescape( CURL * curl , char * url , 
        int inlength , int * outlength );
  

此函数将给定的URL编码输入字符串转换为“plain”   string“并在分配的内存区域中返回。所有输入   URL编码的字符(%XX,其中XX是两位数字   十六进制数)转换为二进制版本。

答案 2 :(得分:0)

这是一个就地版本:

void unescape(std::string & s)
{
    for (std::size_t r = 0, w = 0; r != s.size(); )
    {
        char digit;

        if (s[r] != '%')
        {
            ++r;
            ++w;
        }
        else if (r + 1 < s.size() && s[r + 1] == '%')
        {
            r += 2;
            ++w;
        }
        else if (r + 2 < s.size()) && is_hex(s, r + 1, digit))
        {
            s[w] = digit;
            ++w;
            r += 3;
        }
        else
        {
            // error, throw exception?
        }
    }

    s.erase(s.begin() + r, s.end());
}

bool is_hex(std::string const & s, std::size_t offset, char & result)
{
    unsigned char d1, d2;
    if (hex_digit(s[offset], d1) && hex_digit(s[offset + 1], d2))
    {
        result = d1 * 16 + d2;
        return true;
    }
    return false;
}

bool hex_digit(char c, unsigned char & value)
{
    if (c >= '0' && c <= '9') { value = c - '0'; return true; }

    if (c >= 'a' && c <= 'f') { value = c - 'a' + 10; return true; }

    if (c >= 'A' && c <= 'F') { value = c - 'A' + 10; return true; }

    return false;
}