Помогите мне понять этот URL-декодер: - PullRequest
0 голосов
/ 22 мая 2011

Поработав с декодированием URL-адреса, мне удалось придумать несколько идей, которые сработали, но они не были очень эффективными. Поскольку декодирование URL - это место, где в моей программе может возникнуть серьезное узкое место, я решил выйти в Интернет и найти более эффективное решение. Я наткнулся на эту статью Codeguru:

http://www.codeguru.com/cpp/cpp/string/conversions/article.php/c12759

Теперь я не против использования чужого кода, особенно если он лучше моего. Однако мне нравится знать, как это работает, прежде чем я это сделаю. Нет смысла использовать код, который вы не до конца понимаете.

Вот где я застрял, я понимаю, что большая часть работы с указателем происходит в функции декодирования. Я заблудился в массиве HEX2DEC и связанной с ним арифметике преобразования. Он не представлен на веб-сайте, а приведен в качестве примера загрузки, поэтому я опубликую его здесь для вашего удобства вместе с функцией декодирования:

http://pastebin.com/AVDnr6cK

Как именно эта функция использует этот массив для преобразования шестнадцатеричного числа в десятичное, а затем десятичное в его эквивалент ASCII?

Еще раз спасибо за вашу помощь.

1 Ответ

2 голосов
/ 22 мая 2011

Массив является справочной таблицей, для каждого символа ascii, используемого в качестве индекса, он будет предоставлять либо -1, если символ не является шестнадцатеричным символом (в [0..9], [A..F] или [a..f]), либо преобразование в целое число этого шестнадцатеричного символа.

В основном цикле всякий раз, когда обнаруживается %, массив сначала используется для определения того, являются ли следующие два символа шестнадцатеричными (!= -1), и если это так, он преобразует всю последовательность. Операция (dec1 << 4) + dec2 эквивалентна dec1 * 16 + dec2 и представляет собой преобразование в целое число из 8 битов двух шестнадцатеричных символов.

...