Domanda

Sto riscontrando una sorta di problema con la codifica nel mio HTTPHandler ASP.NET, che carica un file. Il contenuto del file viene passato in una variabile di forma nascosta da una pagina Web ColdFusion che utilizza qualcosa chiamato "ToBase64".

In ColdFusion, il codice utilizzato per posizionare il contenuto del file in un modulo è il seguente:

<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#" />

Quando viene pubblicato il mio UploadHandler.ashx, ricevo una stringa dal modulo come segue:

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

Successivamente, sto convertendo la stringa in una matrice di byte come segue:

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

Ecco la funzione che sto usando per convertire la stringa:

        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
    }

Per me è ovvio che chiamare la funzione sopra con EncodingType.ASCII è sbagliato ma sono molto confuso su cosa sarebbe corretto? Qual è la corrispondenza corretta " tra "Base64" inviato da ColdFusion e il modo in cui la stringa deve essere codificata in .Net?

Nota che tutto il codice "funziona". ma il successivo recupero di un file mostra che è confuso e sono abbastanza sicuro di avere la codifica sbagliata qui.

EDIT-update:

Ho aggiunto il codice enum precedentemente omesso. Ho provato tutti questi tipi di codifica; tutti risultano in "immondizia". Cioè: ho provato ognuna di queste varianti:

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

Nessuno di questi funziona correttamente. Mentre leggo la tua funzione suggerita, dovrebbe essere Unicode. Nota che voglio restituire un array di byte non una stringa convertita. Ancora molto confuso.

Risposta:

Ho semplicemente eliminato l'enum e la funzione che ho scritto chiamato StringToByteArray. Invece ho codificato quanto segue:

byte[] binData = Convert.FromBase64String(fileContent); 
È stato utile?

Soluzione

Guarda la funzione Convert.FromBase64String ()

Altri suggerimenti

Base64 è uno schema di codifica che consente di rappresentare i dati binari come una serie di caratteri ASCII in modo che possano essere inclusi in file di testo e messaggi di posta elettronica in cui i dati binari non elaborati sono inaccettabili. Gli esempi seguenti mostrano la codifica e la decodifica delle stringhe unicode. Fammi sapere se questo è quello che volevi, in caso contrario potrò rifarlo ulteriormente per te.

//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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top