функция DecodeHex раскодирование строки хх CHAR DecodeHex IN LPSTR str

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// функция DecodeHex
// раскодирование строки %хх
CHAR DecodeHex(IN LPSTR str) {
CHAR ch;
// обрабатываем старший разряд
if (str[0] >= 'A') {
ch = ((str[0] & 0xDF) - 'A') + 10;
} else {
ch = str[0] - '0';
}
// сдвигаем его влево на 4 бита
ch <<= 4;
// oбрабатываем младший разряд и складываем его со старшим
if (str[1] >= 'A') {
ch += ((str[1] & 0xDF) - 'A') + 10;
} else {
ch += str[1] - '0';
}
return ch;
}
// Функция DecodeStr
// раскодирование строки в URL
VOID DecodeStr(IN LPSTR sString) {
int src, dst;
CHAR ch;
// цикл по строке
for (src = 0, dst = 0; sString[src]; src++, dst++) {
// получаем очередной символ перекодируемой строки
ch = sString[src];
// заменяем символ + на пробел
ch = (ch == '+') ? ' ' : ch;
// сохраняем результат
sString[dst] = ch;
// обработка шестнадцатеричных кодов вида %хх
if (ch == '%') {
// выполняем преобразование строки %хх в код символа
sString[dst] = DecodeHex(&sString[src + 1]);
src += 2;
}
}
// закрываем строку нулем
sString[dst] = 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nShowCmd) {
// вывод строки заголовка HTTP
printf("Content-type: text/plain\n\n");
// определение общей длины полученных от браузера данных (берется из
// CONTENT_LENGTH)
LPSTR sDataLength;
_dupenv_s(&sDataLength, NULL, "CONTENT_LENGTH");
int lData = atoi(sDataLength);
free(sDataLength);
// выделяем для переданных данных память
LPSTR sBuff = new CHAR[lData + 1];
// копируем эти данные (длиной lData) из входного потока stdin в буфер
// sBuff
fread(sBuff, lData, 1, stdin);
sBuff[lData] = 0; // закрываем строку нулем
// разбираем данные по переменным
// разделитель между переменными - &
LPSTR next_token;
LPSTR current_token = strtok_s(sBuff, "&", &next_token);
LPSTR lpString = "";
while (current_token) {
DecodeStr(current_token); // раскодируем строку из URL-представления
if (strstr(current_token, "string")) {
// нашли переменную с именем "string"
lpString = strchr(current_token, '=') + 1;
}
current_token = strtok_s(NULL, "&", &next_token);
}
// переворачиваем строку и выводим ее в браузер
printf(_strrev(lpString));
return 0;
}