2

我在上传文件的 ASP.NET HTTPHandler 中遇到了某种编码问题。文件内容是从一个使用名为“ToBase64”的 ColdFusion 网页的隐藏表单变量中传递的。

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

2 回答 2

3

Convert.FromBase64String()功能

于 2009-08-03T19:14:05.087 回答
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);
}
于 2009-08-03T19:13:12.170 回答