【问题标题】:What is proper encoding for converting a string to a byte array将字符串转换为字节数组的正确编码是什么
【发布时间】:2009-08-03 19:04:22
【问题描述】:

我在上传文件的 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); 

【问题讨论】:

  • 我不知道 ColdFusion,所以我无法建议您如何通过任何构建库(如果存在)来处理它,但您需要 Base 64 解码器。 Base64 是一种数据编码方案,而不是文本编码方案……您可以使用 UTF8 或 ASCII 或任何其他 Base64 编码。查看上面的 wiki 页面:en.wikipedia.org/wiki/Base64
  • 这确实是 CF 正在做的事情。不过,不推荐使用 ToBase64()。您可能应该使用 BinaryEncode()。见:cfquickdocs.com/cf8/#BinaryEncode

标签: asp.net string encoding coldfusion bytearray


【解决方案1】:

Convert.FromBase64String()函数

【讨论】:

  • 非常感谢!这现在有效。我只是消除了枚举和我编写的名为 StringToByteArray 的函数。相反,我编写了以下代码: byte[] binData = Convert.FromBase64String(fileContent);结案。你是一个巨大的帮助......(似乎是一个非常大的主题)。
【解决方案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);
}

【讨论】:

  • 我认为他只是想要字节数组-字符串不是最终目标。
  • 是的...我想要一个字节数组,而不是字符串。另外,请参阅我对原始帖子的编辑更新。谢谢...我还在摸索..
  • 我想知道我对 StringToByteArray 函数的使用是否错误。当我从 Request.Form 中提取数据时,我首先将其放入一个字符串中。也许这是不正确的?
猜你喜欢
  • 2015-03-15
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 2021-02-04
  • 2021-11-11
相关资源
最近更新 更多