2009-08-03 34 views
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中编码的方式之间的适当“匹配”是什么?

请注意,所有的代码“工作”,但后来的文件检索显示它是混乱的,我敢肯定,我在这里编码错了。

EDIT更新:

我添加枚举代码先前删去。我已经尝试了所有这些编码类型;他们都导致“垃圾”。那就是:我已经尝试了这些变化:

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

我不知道ColdFusion的,所以我不能建议您如何应该由任何构建在库(如果存在)进行处理,但你需要一个基地64解码器。 Base64是一种数据编码方案,而不是文本编码方案......您可以使用UTF8或ASCII或任何其他Base64编码方式。看看它的wiki页面:http://en.wikipedia.org/wiki/Base64 – rmeador 2009-08-03 19:09:22

+0

这确实是CF正在做的事情。 ToBase64()已被弃用,但。你应该使用BinaryEncode()。见:http://cfquickdocs.com/cf8/#BinaryEncode – ale 2009-08-03 19:58:16

回答

3

看那Convert.FromBase64String()功能

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

我想他只是想要字节数组字符串不是最终目标。 – 2009-08-03 19:15:39

相关问题