C/C++ URL解码库

mic*_*ael 10 c c++ linux

我正在开发linux上的ac/c ++程序.如果有任何c/c ++库解码url,你能告诉我吗?

我正在寻找将"http%3A%2F%2F"转换为:"http://"的库

或"a + t +%26 + t"到"at&t"

谢谢.

Tho*_*asH 23

我实际上在我正在编写的分析程序中使用了Saul的功能(分析了数百万个URL编码的字符串),虽然它有效,但是在这个规模上,它使我的程序放慢了速度,所以我决定写一个更快的版本.使用GCC和-O2选项编译时,这个速度要快几千倍.它也可以使用与输入相同的输出缓冲区(例如,如果原始字符串在buf中并且要被其解码的对应物覆盖,则urldecode2(buf,buf)将起作用).

编辑:它没有将缓冲区大小作为输入,因为假设缓冲区足够大,这是安全的,因为已知输出的长度总是<=输入的长度,所以要么对输出使用相同的缓冲区或为null终止符创建一个至少为输入+ 1的大小的缓冲区,例如:

char *output = malloc(strlen(input)+1);
urldecode2(output, input);
printf("Decoded string: %s\n", output);
Run Code Online (Sandbox Code Playgroud)

编辑2:一位匿名用户试图编辑这个答案来处理'+'字符的翻译'',我认为应该这样做,这也不是我应用程序所需要的,但我添加了它下面.

这是例程:

#include <stdlib.h>
#include <ctype.h>

void urldecode2(char *dst, const char *src)
{
        char a, b;
        while (*src) {
                if ((*src == '%') &&
                    ((a = src[1]) && (b = src[2])) &&
                    (isxdigit(a) && isxdigit(b))) {
                        if (a >= 'a')
                                a -= 'a'-'A';
                        if (a >= 'A')
                                a -= ('A' - 10);
                        else
                                a -= '0';
                        if (b >= 'a')
                                b -= 'a'-'A';
                        if (b >= 'A')
                                b -= ('A' - 10);
                        else
                                b -= '0';
                        *dst++ = 16*a+b;
                        src+=3;
                } else if (*src == '+') {
                        *dst++ = ' ';
                        src++;
                } else {
                        *dst++ = *src++;
                }
        }
        *dst++ = '\0';
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你。我今天可以使用它了。正如 Adrià 评论的那样,“a -= 'A' - 'a'”和 b -= 'A' - 'a'” 计算是错误的,并且对小写的十六进制数字给出了不好的结果。我冒昧地用我的编辑权限。现在该示例正确处理大写和小写十六进制。 (2认同)

Cri*_*dam 5

uriparser库体积小,重量轻。


chm*_*ike 5

这是百分比编码字符串的C解码器。如果编码无效,则返回-1,否则返回0。解码后的字符串存储在外面。我很确定这是到目前为止给出的答案中最快的代码。

int percent_decode(char* out, const char* in) {
{
    static const char tbl[256] = {
        -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
        -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
        -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
         0, 1, 2, 3, 4, 5, 6, 7,  8, 9,-1,-1,-1,-1,-1,-1,
        -1,10,11,12,13,14,15,-1, -1,-1,-1,-1,-1,-1,-1,-1,
        -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
        -1,10,11,12,13,14,15,-1, -1,-1,-1,-1,-1,-1,-1,-1,
        -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
        -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
        -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
        -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
        -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
        -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
        -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
        -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
        -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1
    };
    char c, v1, v2, *beg=out;
    if(in != NULL) {
        while((c=*in++) != '\0') {
            if(c == '%') {
                if((v1=tbl[(unsigned char)*in++])<0 || 
                   (v2=tbl[(unsigned char)*in++])<0) {
                    *beg = '\0';
                    return -1;
                }
                c = (v1<<4)|v2;
            }
            *out++ = c;
        }
    }
    *out = '\0';
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • @GaspardP你是对的。我将您建议的修改应用于答案。 (2认同)

unw*_*ind 3

优秀的glib具有一些URI 功能,包括方案提取、转义和反转义。