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);
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
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