文字列をバイト配列に変換するための適切なエンコーディングは何ですか
-
11-07-2019 - |
質問
ファイルをアップロードするASP.NET HTTPHandlerのエンコーディングに何らかの問題があります。ファイルの内容は、" ToBase64"と呼ばれるものを使用しているColdFusion Webページから非表示のフォーム変数で渡されます。
ColdFusionでは、ファイルコンテンツをフォームに配置するために使用されるコードは次のとおりです。
<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#" />
UploadHandler.ashxが投稿されると、次のようにフォームから文字列が取得されます。
string fileContent = context.Request.Form["objBinaryData"];
次に、次のように文字列をバイト配列に変換しています:
byte[] binData = StringToByteArray(fileContent, EncodingType.ASCII);
文字列の変換に使用している関数は次のとおりです。
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
}
EncodingType.ASCIIで上記の関数を呼び出すのは間違っていることは明らかですが、何が正しいのか非常に混乱していますか?適切な「一致」とは何ですか&quot; Base64&quot;の間ColdFusionから送信された文字列を.Netでエンコードする方法
すべてのコードが「機能する」ことに注意してください。しかし、その後のファイルの取得では、ファイルがスクランブルされていることが示され、ここで間違ったエンコーディングを使用していると確信しています。
編集-更新:
以前に省略した列挙コードを追加しました。これらのエンコーディングタイプをすべて試しました。それらはすべて「ゴミ」になります。つまり、これらのバリエーションをそれぞれ試しました:
byte[] binData = StringToByteArray(fileContent, EncodingType.ASCII);
byte[] binData = StringToByteArray(fileContent, EncodingType.Unicode);
byte[] binData = StringToByteArray(fileContent, EncodingType.UTF7);
byte[] binData = StringToByteArray(fileContent, EncodingType.UTF8);
これらのどれも適切に動作しません。私があなたの提案された機能を読んだとき、それはユニコードでなければなりません。変換された文字列ではなく、バイト配列を返したいことに注意してください。まだ非常に混乱しています。
回答:
列挙型とStringToByteArrayと呼ばれる関数を単に削除しました。代わりに、次をコーディングしました:
byte[] binData = Convert.FromBase64String(fileContent);
解決
Convert.FromBase64String()
関数をご覧ください
他のヒント
Base64は、バイナリデータを一連のASCII文字として表現できるようにするエンコードスキームであるため、生のバイナリデータが受け入れられないテキストファイルや電子メールメッセージに含めることができます。以下の例は、Unicode文字列のエンコードとデコードを示しています。これがあなたが望んでいたものであるかどうかを教えてください。そうでない場合、私はあなたのためにこれをさらに見つけることができます。
//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);
}