Pregunta

Tengo algún tipo de problema con la codificación en mi ASP.NET HTTPHandler, que carga un archivo. El contenido del archivo se pasa en una variable de forma oculta desde una página web de ColdFusion que utiliza algo llamado "ToBase64".

En ColdFusion, el código utilizado para colocar el contenido del archivo en un formulario es el siguiente:

<cffile action="readBinary" file="#FileName#" variable="objBinaryData">
    <cfset b64file = #toBase64(objBinaryData)#>
<form name="sendToHandler" 
           action="http://myserver/mysite/UploadHandler.ashx" method="post">
   <cfoutput>
       <input type="hidden" name="objBinaryData" value="#b64file#" />

Cuando se publica mi UploadHandler.ashx, obtengo una cadena del formulario de la siguiente manera:

            string fileContent = context.Request.Form["objBinaryData"];

A continuación, estoy convirtiendo la cadena en una matriz de bytes de la siguiente manera:

            byte[] binData = StringToByteArray(fileContent, EncodingType.ASCII);

Aquí está la función que estoy usando para convertir la cadena:

        public static byte[] StringToByteArray(string str, EncodingType encodingType)
    {
        System.Text.Encoding encoding = null;
        switch (encodingType)
        {
            case EncodingType.ASCII:
                encoding = new System.Text.ASCIIEncoding();
                break;
            case EncodingType.Unicode:
                encoding = new System.Text.UnicodeEncoding();
                break;
            case EncodingType.UTF7:
                encoding = new System.Text.UTF7Encoding();
                break;
            case EncodingType.UTF8:
                encoding = new System.Text.UTF8Encoding();
                break;
        }
        return encoding.GetBytes(str);
    }
public enum EncodingType
    {
        ASCII,
        Unicode,
        UTF7,
        UTF8
    }

Es obvio para mí que llamar a la función anterior con EncodingType.ASCII está mal, pero estoy muy confundido acerca de lo que sería correcto. ¿Cuál es el "partido" adecuado? entre " Base64 " enviado desde ColdFusion y la forma en que la cadena debe codificarse en .Net?

Tenga en cuenta que todo el código "funciona" pero la recuperación posterior de un archivo muestra que está codificado y estoy bastante seguro de que tengo la codificación incorrecta aquí.

EDITAR-actualización:

Agregué el código de enumeración previamente omitido. He probado todos estos tipos de codificación; todos resultan en "basura". Es decir: he probado cada una de estas variaciones:

byte[] binData = StringToByteArray(fileContent, EncodingType.ASCII);
byte[] binData = StringToByteArray(fileContent, EncodingType.Unicode);
byte[] binData = StringToByteArray(fileContent, EncodingType.UTF7);
byte[] binData = StringToByteArray(fileContent, EncodingType.UTF8);

Ninguno de estos funciona correctamente. Mientras leo su función sugerida, debería ser Unicode. Tenga en cuenta que quiero devolver una matriz de bytes, no una cadena convertida. Aún muy confundido.

RESPUESTA:

Simplemente eliminé la enumeración y la función que escribí llamada StringToByteArray. En cambio, codifiqué lo siguiente:

byte[] binData = Convert.FromBase64String(fileContent); 
¿Fue útil?

Solución

Mire la función Convert.FromBase64String ()

Otros consejos

Base64 es un esquema de codificación que le permite representar datos binarios como una serie de caracteres ASCII para que puedan incluirse en archivos de texto y mensajes de correo electrónico en los que los datos binarios sin procesar son inaceptables. Los siguientes ejemplos muestran la codificación y decodificación de cadenas unicode. Avíseme si esto es lo que quería, si no, puedo encontrarlo más para usted.

//Encoding
 public static string StringToBase64 (string src) {

    // Get's byte representation unicode string
    byte[] b = Encoding.Unicode.GetBytes(src);

    // Returns Base64-encoded string
    return Convert.ToBase64String(b);

}
//Decoding
public static string Base64ToString (string src) {

    // Decodes Base64-encoded string to a byte array
    byte[] b = Convert.FromBase64String(src);

    // Returns decoded Unicode string
    return Encoding.Unicode.GetString(b);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top