O que é a codificação apropriada para converter uma string para um array de bytes
-
11-07-2019 - |
Pergunta
Estou tendo algum tipo de problema com a codificação em meu ASP.NET HTTPHandler, que envia um arquivo. O conteúdo do arquivo é passado em uma variável de formulário oculto de uma página web ColdFusion que está usando algo chamado "ToBase64".
Em ColdFusion, o código usado para colocar o conteúdo do arquivo em um formulário é a seguinte:
<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 meu UploadHandler.ashx é publicado, eu estou recebendo uma corda fora do formulário da seguinte forma:
string fileContent = context.Request.Form["objBinaryData"];
Em seguida, eu estou convertendo a string para um array de bytes da seguinte forma:
byte[] binData = StringToByteArray(fileContent, EncodingType.ASCII);
Aqui é a função que estou usando para converter a string:
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
}
É óbvio para mim que chamar a função acima com EncodingType.ASCII é errado, mas eu estou muito confuso sobre o que seria correto? Qual é o "match" adequada entre "Base64" enviado do ColdFusion ea forma como a cadeia deve ser codificado em .net?
Por favor, note que todo o código "obras", mas a recuperação posterior de um arquivo mostra-lo para ser mexidos e eu tenho certeza que eu tenho o errado codificação aqui.
EDIT-update:
Eu adicionei o código de enumeração anteriormente omitidas. Eu tentei todos esses tipos de codificação; todos eles resultar em "lixo". Ou seja: eu tentei cada uma dessas variações:
byte[] binData = StringToByteArray(fileContent, EncodingType.ASCII);
byte[] binData = StringToByteArray(fileContent, EncodingType.Unicode);
byte[] binData = StringToByteArray(fileContent, EncodingType.UTF7);
byte[] binData = StringToByteArray(fileContent, EncodingType.UTF8);
Nenhum destes trabalho corretamente. Como eu li a sua função sugerida, deve ser Unicode. Note que eu quero retornar um array de bytes e não uma cadeia convertida. Ainda muito confuso.
RESPOSTA:
Eu simplesmente eliminou a enumeração ea função que eu escrevi chamado StringToByteArray. Em vez disso eu codificado o seguinte:
byte[] binData = Convert.FromBase64String(fileContent);
Solução
Olhe para a função Convert.FromBase64String()
Outras dicas
Base64 é um esquema de codificação que permite que você para representar dados binários como uma série de caracteres ASCII para que ele possa ser incluído em arquivos de texto e mensagens de correio electrónico em que os dados binários brutos é inaceitável. A seguir mostram exemplos de codificação e descodificação de cadeias Unicode. Deixe-me saber se é isso que você queria, se não posso reencontrar mais este para você.
//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);
}