我正在开发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)
这是百分比编码字符串的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)
| 归档时间: |
|
| 查看次数: |
30029 次 |
| 最近记录: |