2009-08-03 8 views
2

J'ai un problème de codage dans mon HTTPHandler ASP.NET, qui télécharge un fichier. Le contenu du fichier est transmis dans une variable de formulaire cachée à partir d'une page Web ColdFusion qui utilise quelque chose appelé "ToBase64".Quel est le codage approprié pour convertir une chaîne en un tableau d'octets

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

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

Quand mon UploadHandler.ashx est affiché, je reçois une chaîne de la forme comme suit:

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

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

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

Voici la fonction que je 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 d'appeler la fonction ci-dessus avec EncodingType.ASCII est mal, mais je suis très confus au sujet de ce qui serait exact? Quelle est la "correspondance" entre "Base64" envoyée par ColdFusion et la façon dont la chaîne doit être codée dans .Net?

S'il vous plaît noter que tout le code "fonctionne", mais la récupération ultérieure d'un fichier montre qu'il doit être brouillé et je suis sûr que j'ai un mauvais encodage ici.

EDIT mise à jour:

J'ai ajouté le code ENUM précédemment omis. J'ai essayé tous ces types d'encodage; ils entraînent tous des "déchets". C'est-à-dire: 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); 

Aucune de ces variantes ne fonctionne correctement. Comme j'ai lu votre fonction suggérée, il devrait être Unicode. Notez que je veux retourner un tableau d'octets pas une chaîne convertie. Toujours très confus.

RÉPONSE:

J'ai simplement éliminé le ENUM et la fonction que j'ai écrit appelé StringToByteArray. Au lieu de cela, je codé les suivantes:

byte[] binData = Convert.FromBase64String(fileContent); 
+1

Je ne sais pas ColdFusion, donc je ne peux pas vous conseiller sur la façon dont il doit être manipulé par une construction dans libs, si elles existent, mais vous avez besoin d'une base 64 décodeur. Base64 est un schéma de codage de données, pas un schéma de codage de texte ... vous pouvez avoir UTF8 ou ASCII ou tout autre encodage Base64. Jetez un coup d'œil à la page du wiki: http://en.wikipedia.org/wiki/Base64 – rmeador

+0

C'est en effet ce que fait CF. ToBase64() est déprécié, cependant. Vous devriez probablement utiliser BinaryEncode(). Voir: http://cfquickdocs.com/cf8/#BinaryEncode – ale

Répondre

3

Regardez la fonction Convert.FromBase64String()

+0

Merci beaucoup! Cela fonctionne maintenant. J'ai simplement éliminé l'enum 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); Cas fermé. Vous avez été d'une grande aide ... (semble être un très gros sujet). –

2

base64 est un système de codage qui vous permet de représenter des données binaires comme une série de caractères ASCII pour qu'il puisse être inclus dans des fichiers texte et des messages électroniques dans lesquels des données binaires brutes est inacceptable. Les exemples ci-dessous montrent l'encodage et le décodage des chaînes Unicode. Faites-moi savoir si c'est ce que vous vouliez, sinon je peux vous en dire plus pour vous.

//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); 
} 
+0

Je pense qu'il veut juste que l'octet array-string n'est pas le but final. –

+0

Oui ... Je veux un tableau d'octets, pas une chaîne.Aussi, s'il vous plaît voir ma mise à jour EDIT de l'article original. Merci ... Je suis encore à tâtons .. –

+0

Je me demande si mon utilisation de ma fonction StringToByteArray est erronée. Lorsque je récupère les données de Request.Form, je les place d'abord dans une chaîne. Peut-être que c'est incorrect? –

Questions connexes