Qual è la codifica corretta per convertire una stringa in un array di byte
-
11-07-2019 - |
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);
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);
}