2009-12-11 18 views
27

Estoy trabajando en un generador de captcha rápido para un sitio simple que estoy reuniendo, y espero pasar una clave encriptada en la url de la página. Probablemente podría hacer esto como un parámetro de cadena de consulta bastante fácil, pero espero no hacerlo también (porque nada más se ejecuta fuera de la cadena de consulta) ...C# Byte [] a Url Friendly String

Mi código de cifrado produce un byte [], que es entonces transformado usando Convert.ToBase64String (byte []) en una cadena. Sin embargo, esta cadena todavía no es amigable para las URL, ya que puede contener elementos como '/' y '='. ¿Alguien sabe de una mejor función en el marco .NET para convertir una matriz de bytes en una cadena amigable para la URL?

Sé todo sobre System.Web.HttpUtility.UrlEncode() y sus equivalentes, sin embargo, solo funcionan correctamente con los parámetros de cadena de consulta. Si url codifica un '=' dentro de la ruta, mi servidor web devuelve un error de 400 Bad Request.

De todas formas, no es un tema crítico, pero esperando que alguien me puede dar una buena solución

** EDIT: Sólo para estar absolutamente seguro exactamente lo que estoy haciendo con la cadena, pensé que podría suministrar un poco más información.

El byte [] que resulta de mi algoritmo de cifrado debe alimentarse a través de algún tipo de algoritmo para convertirlo en una cadena amigable para las URL. Después de esto, se convierte en el contenido de un XElement, que luego se utiliza como el documento de origen para una transformación XSLT, y se utiliza como parte del atributo href para un ancla. No creo que la transformación xslt esté causando los problemas, ya que lo que viene en la ruta parece ser un parámetro de cadena de consulta codificada, pero causa el HTTP 400

También he intentado HttpUtility.UrlPathEncode() en una cadena base64, pero eso no parece hacer el truco, ya sea (todavía termino con '/' s en mi url) **

Respuesta

82

Está buscando HttpServerUtility.UrlTokenEncode y HttpServerUtility.UrlTokenDecode, en System.Web.

Codifican en base64, reemplazando los caracteres potencialmente peligrosos '+' y '/' con '-' y '_' en su lugar.

MSDN documentation

+1

¿En serio? Debo probar esto ahora ... – LorenVS

+1

+1: Base64 es una codificación más compacta que simplemente usar los dígitos hexadecimales de 'BitConverter.ToString'. – LukeH

+2

Funcionó como un amuleto ... Función malvada (poco conocida) allí ... Gracias hombre – LorenVS

1

Tenga una mirada en System.BitConverter.ToString(myByteArray)

práctico para un modo de codificación para cosas como hashes, pero como se señaló por ssg no es muy eficiente. No lo recomendaría para grandes cantidades de datos.

+0

estoy dispuesto a ir a la codificación hexadecimal, si hay una función para revertir esta operación ... – LorenVS

+0

Para referencia, BitConverter.GetBytes() no tiene una sobrecarga que tiene una cadena – LorenVS

+0

Se encuentra esta url como referencia http://stackoverflow.com/questions/1230303/bitconverter-tostring-in-reverse solo usará esta solución – LorenVS

0

si está trabajando en un código de imagen rápidapara un sitio sencilla usted está preparando, ¿por qué estás escribiendo desde cero en lugar de utilizar algo que se ha probado como recaptcha?

+0

b/c no tiene que ser perfecto ... Simplemente tiene que funcionar, y es algo educativo.Nunca antes había escrito un captcha, imagino que valdría la pena intentarlo ... Es solo para un sitio personal, nada elegante – LorenVS