URL C/C++ декодирует библиотеку

Я разрабатываю c/c ++ программа на Linux. Можно ли сказать мне, если существует какой-либо c/c ++ библиотека, которая декодирует URL?

Я ищу библиотеки, которые преобразовывают "http%3A%2F%2F" в: "http://"

или "a+t + % 26+t" к "t и t"

Спасибо.

10
задан michael 20 April 2010 в 16:26
поделиться

3 ответа

Непревзойденный glib имеет несколько функций URI , включая извлечение схемы, экранирование и не убежать.

3
ответ дан 3 December 2019 в 13:50
поделиться

Библиотека uriparser небольшая и легкая.

3
ответ дан 3 December 2019 в 13:50
поделиться

Эта функция, которую я только что создал, очень легкая и должна работать так, как вы хотите, обратите внимание, я не запрограммировал ее в соответствии со строгими стандартами URI (использовал то, что Я знаю это с головы до ног). Насколько я могу судить, это буферно-безопасно и не переполняется; адаптировать по своему усмотрению:

#include <assert.h>

void urldecode(char *pszDecodedOut, size_t nBufferSize, const char *pszEncodedIn)
{
    memset(pszDecodedOut, 0, nBufferSize);

    enum DecodeState_e
    {
        STATE_SEARCH = 0, ///< searching for an ampersand to convert
        STATE_CONVERTING, ///< convert the two proceeding characters from hex
    };

    DecodeState_e state = STATE_SEARCH;

    for(unsigned int i = 0; i < strlen(pszEncodedIn)-1; ++i)
    {
        switch(state)
        {
        case STATE_SEARCH:
            {
                if(pszEncodedIn[i] != '%')
                {
                    strncat(pszDecodedOut, &pszEncodedIn[i], 1);
                    assert(strlen(pszDecodedOut) < nBufferSize);
                    break;
                }

                // We are now converting
                state = STATE_CONVERTING;
            }
            break;

        case STATE_CONVERTING:
            {
                // Conversion complete (i.e. don't convert again next iter)
                state = STATE_SEARCH;

                // Create a buffer to hold the hex. For example, if %20, this
                // buffer would hold 20 (in ASCII)
                char pszTempNumBuf[3] = {0};
                strncpy(pszTempNumBuf, &pszEncodedIn[i], 2);

                // Ensure both characters are hexadecimal
                bool bBothDigits = true;

                for(int j = 0; j < 2; ++j)
                {
                    if(!isxdigit(pszTempNumBuf[j]))
                        bBothDigits = false;
                }

                if(!bBothDigits)
                    break;

                // Convert two hexadecimal characters into one character
                int nAsciiCharacter;
                sscanf(pszTempNumBuf, "%x", &nAsciiCharacter);

                // Ensure we aren't going to overflow
                assert(strlen(pszDecodedOut) < nBufferSize);

                // Concatenate this character onto the output
                strncat(pszDecodedOut, (char*)&nAsciiCharacter, 1);

                // Skip the next character
                i++;
            }
            break;
        }
    }
}
3
ответ дан 3 December 2019 в 13:50
поделиться