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); 
Foi útil?

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);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top