2009-12-11 2 views
27

Я работаю над быстрым генератором капчей для простого сайта, который я собираю, и я надеюсь передать зашифрованный ключ в URL-адрес страницы. Я мог бы, вероятно, сделать это как параметр строки запроса достаточно простым, но я надеюсь не слишком (просто потому, что ничего не убегает от строки запроса) ...C# Byte [] to Url Friendly String

Мой код шифрования создает байт [], который затем преобразованный с помощью Convert.ToBase64String (byte []) в строку. Однако эта строка по-прежнему не совсем понятна для URL, поскольку она может содержать такие вещи, как «/» и «=». Кто-нибудь знает о лучшей функции в .NET framework для преобразования массива байтов в дружественную строку?

Я знаю все о System.Web.HttpUtility.UrlEncode() и его эквивалентах, однако они работают только с параметрами строки запроса. Если я url кодирую '=' внутри пути, мой веб-сервер возвращает ошибку 400 Bad Request.

В любом случае, не является критической проблемой, но надеясь, что кто-то может дать мне хорошее решение

** EDIT: Просто чтобы быть абсолютно уверен, что именно я делаю со строкой, я полагал, что будет поставлять немного больше информации.

Байт [], который является результатом моего алгоритма шифрования, должен передаваться через какой-то алгоритм, чтобы превратить его в дружественную URL-строку. После этого он становится содержимым XElement, который затем используется как исходный документ для преобразования XSLT и используется как часть атрибута href для привязки. Я не верю, что преобразование xslt вызывает проблемы, поскольку то, что происходит на пути, похоже, является параметром строки закодированного запроса, но вызывает HTTP 400

Я также пробовал HttpUtility.UrlPathEncode() на строка base64, но это, кажется, не делать трюк либо (я до сих пор в конечном итоге с «/» s в моем URL) **

ответ

82

Вы ищете HttpServerUtility.UrlTokenEncode и HttpServerUtility.UrlTokenDecode, в System.Web.

Они кодируют в base64, заменяя потенциально опасные символы «+» и «/» на «-» и «_».

MSDN documentation

+1

Серьезно? Я должен попробовать это сейчас ... – LorenVS

+1

+1: Base64 - более компактное кодирование, чем просто использование шестнадцатеричных цифр из «BitConverter.ToString». – LukeH

+2

Работал как шарм ... Злая (мало известная) функция там ... Спасибо человеку – LorenVS

1

Посмотрите System.BitConverter.ToString(myByteArray)

Handy для один путь для кодирования такие вещи, как хэши, но, как указано в ssg, это не очень эффективно. Я бы не рекомендовал его для больших объемов данных.

+0

Я готов пойти в Hex Encoding, если есть функция, чтобы изменить эту операцию ... – LorenVS

+0

ориентировочные, BitConverter.GetBytes() не имеет перегрузку, которая принимает строку – LorenVS

+0

Найден этот url для справки http://stackoverflow.com/questions/1230303/bitconverter-tostring-in-reverse будет использовать это решение – LorenVS

0

, если вы работаете на быстро капчи для простой вы собираете, почему вы пишете с нуля вместо того, чтобы использовать то, что было испытанный как recaptcha?

+0

b/c он не должен быть совершенным ... Он просто должен работать, и его образовательная вещь.Я никогда раньше не писал капчу, цифра бы стоила того ... Это просто для личного сайта, ничего необычного – LorenVS