gpt4 book ai didi

c - URL 解码函数 : what is it doing exactly ? 需要解释

转载 作者:太空宇宙 更新时间:2023-11-04 02:29:46 24 4
gpt4 key购买 nike

这是一个 URL-解码字符串的函数。

它工作正常。我想要一些关于它到底在做什么的信息。

  • 它用什么替换了哪些字符。
  • 为什么必须使用isxdigit函数?

也许有一天我会以一种方式重新编码它以便它在视觉上看起来不像现在那么困惑。

void url_decode(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';
}

最佳答案

该函数从src指向的字符串复制一个URL到dst指向的数组,将%xx的序列转换为2 个十六进制数字到它们所代表的单个字符。

%后面的2个字符存入ab,测试它们不是'\0' 字节并使用 isxdigit() 验证它们是十六进制数字。

但是请注意,在调用 isxdigit 之前,应将 char 值转换为 unsigned char,以避免负值的未定义行为。

另请注意,测试是多余的,因为 isxdigit() 对空字节返回 false。

然后将字符转换为小写,再转换为它们所代表的数值。

生成的字符被计算为 16 * a + b 并存储到 dst 中。

+ 符号转换为空格,其他字符保持不变。

这是一个更简单的版本:

#include <ctype.h>

void url_decode(char *dst, const char *src) {
unsigned char a, b;
while (*src) {
if (*src == '%'
&& isxdigit(a = tolower((unsigned char)src[1]))
&& isxdigit(b = tolower((unsigned char)src[2]))) {
a -= isdigit(a) ? '0' : 'a';
b -= isdigit(b) ? '0' : 'a';
*dst++ = 16 * a + b;
src += 3;
} else
if (*src == '+') {
*dst++ = ' ';
src++;
} else {
*dst++ = *src++;
}
}
*dst = '\0';
}

关于c - URL 解码函数 : what is it doing exactly ? 需要解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45031342/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com