我在我的ASP.NET HTTPHandler中遇到了一些编码问题,它上传了一个文件。文件内容在ColdFusion网页的隐藏表单变量中传递,该网页使用名为“ToBase64”的东西。
在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调用上面的函数是错误的,但我对于什么是正确的我很困惑?从ColdFusion发送的“Base64”和字符串应该在.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);
这些都不能正常工作。当我阅读你建议的函数时,它应该是Unicode。请注意,我想返回一个字节数组而不是转换后的字符串。还是很困惑。
解答:
我简单地删除了枚举和我写的名为StringToByteArray的函数。相反,我编写了以下内容:
byte[] binData = Convert.FromBase64String(fileContent);
答案 0 :(得分:3)
查看Convert.FromBase64String()
函数
答案 1 :(得分:2)
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);
}