Question

Je rencontre un problème d'encodage dans mon HTTPHandler ASP.NET, qui télécharge un fichier. Le contenu du fichier est transmis dans une variable de formulaire masquée à partir d'une page Web ColdFusion qui utilise un élément appelé "ToBase64".

Dans ColdFusion, le code utilisé pour placer le contenu du fichier dans un formulaire est le suivant:

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

Lorsque mon UploadHandler.ashx est publié, je récupère une chaîne du formulaire comme suit:

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

Ensuite, je convertis la chaîne en un tableau d'octets comme suit:

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

Voici la fonction que j'utilise pour convertir la chaîne:

        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
    }

Il est évident pour moi que l'appel de la fonction ci-dessus avec EncodingType.ASCII est une erreur, mais je suis très confus quant à ce qui serait correct. Quel est le bon " match " entre " Base64 " envoyé par ColdFusion et la manière dont la chaîne doit être codée en .Net?

Veuillez noter que tout le code "fonctionne". mais la récupération ultérieure d'un fichier montre qu'il est brouillé et je suis à peu près sûr que j'ai le mauvais encodage ici.

EDIT-update:

J'ai ajouté le code enum précédemment omis. J'ai essayé tous ces types d'encodage; ils aboutissent tous à un "déchet". C’est-à-dire que j’ai essayé chacune de ces variantes:

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

Aucun de ceux-ci ne fonctionne correctement. Lorsque je lis votre fonction suggérée, ce devrait être Unicode. Notez que je veux renvoyer un tableau d'octets et non une chaîne convertie. Toujours très confus.

RÉPONSE:

J'ai simplement éliminé l'énumération et la fonction que j'ai écrite appelée StringToByteArray Au lieu de cela, j'ai codé ce qui suit:

byte[] binData = Convert.FromBase64String(fileContent); 
Était-ce utile?

La solution

Regardez la fonction Convert.FromBase64String ()

Autres conseils

Base64 est un schéma de codage qui vous permet de représenter les données binaires sous la forme d’une série de caractères ASCII afin de pouvoir les inclure dans les fichiers texte et les messages électroniques dans lesquels les données binaires brutes sont inacceptables. Les exemples ci-dessous illustrent le codage et le décodage de chaînes unicode. Faites-moi savoir si c'est ce que vous vouliez, sinon je peux vous en dire plus.

//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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top