将字符串转换为字节数组 - 无法工作

4

我有一个流被转换成字节数组。

然后我把那个字节数组转换成字符串。

当我尝试把那个字符串再次转换成字节数组时,结果不正确...请参见下面的代码。

     private void Parse(Stream stream, Encoding encoding)
     {
        // Read the stream into a byte array
        byte[] allData = ToByteArray(stream);

        // Copy to a string for header parsing
        string allContent = encoding.GetString(allData);

        //This does not convert back right - just for demo purposes, not how the code is used
        allData = encoding.GetBytes(allContent);
    }

    private byte[] ToByteArray(Stream stream)
    {
        byte[] buffer = new byte[32768];
        using (MemoryStream ms = new MemoryStream())
        {
            while (true)
            {
                int read = stream.Read(buffer, 0, buffer.Length);
                if (read <= 0)
                    return ms.ToArray();
                ms.Write(buffer, 0, read);
            }
        }
    }

1
请展示一下ToByteArray(Stream s)函数的代码。 - Pilgerstorfer Franz
你能具体说明一下“不正确”是什么意思吗? - Edwin de Koning
你会将哪种编码传递给Parse()方法?而Stream中的数据使用哪种编码? - C.Evenhuis
你能详细说明有什么不同吗?可能只是前几个字节不同,这些字节可能包含编码类型信息。 - Mas
我正在使用 Encoding.UTF8 进行编码。 - Adam
当从流编码时,allData = {byte[25360]},在我将字符串转换回字节数组后,allData = {byte[44771]}。 - Adam
2个回答

2

我认为将ToByteArray方法更改为使用与编码匹配的StreamReader应该可以解决这个问题,但是如果没有看到更多的代码,我不能确定。

private byte[] ToByteArray(Stream stream, System.Text.Encoding encoding)
{
    using(var sr = new StreamReader(stream, encoding))
    {
        return encoding.GetBytes(sr.ReadToEnd());
    }
}

编辑
由于您正在处理图像数据,因此应使用Convert.ToBase64Stringbyte[]转换为string。然后,您可以使用Convert.FromBase64String解码将其转换回byte[]。之所以encoding.GetBytes无法工作是因为在该编码中可能有一些不能表示为字符串的byte[]数据。

private void Parse(Stream stream, Encoding encoding)
{
    byte[] allData = ToByteArray(stream);

    string allContent = Convert.ToBase64String(allData);  

    allData = Convert.FromBase64String(allContent);
}

流中传来一个提交的 HTML 表单,它的 enctype="multipart/form-data"。 - Adam
@Adam 你确定图像数据在multipart/form消息中不是以base64编码的吗?如果是的话,你需要在保存到磁盘之前进行解码。 - rsbarro
@Adam,还有一件事,这些数据是通过ASP.NET上传的吗?看起来你正在尝试处理表单提交,如果你在ASP.NET下,有比直接访问RequestStream更容易读取文件的方法(如果这是正在发生的事情)。 - rsbarro
是的,因为如果我不把它放回字节数组中,它现在可以工作。 - Adam
@Adam,这有点超出了你最初问题的范围。我很乐意尝试解决它,但你需要用确切的内容更新原始问题。我只是试图提供一种将byte[]转换为字符串再转换回byte[]的方法,这也是原始问题的主题。 - rsbarro
显示剩余5条评论

2

尽管它们都使用相同的编码,但为什么它们无法正常工作?你有任何想法如何使其正常工作吗?基本上,我正在解析一个包含图像和一些值的multipart/form-data。 - Adam
你能比较这两个字节数组并查看有什么不同吗?它们的长度是否不同(不是数组的大小本身,而是数组的内容)?只有前两个字节不同吗?UTF-16可以编码为小端或大端,前两个字节表示使用哪种方式:http://en.wikipedia.org/wiki/Byte_order_mark#cite_note-11 - Mas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接