C# 编写Arraylist<;字节[]>;到文件生成无效结果(损坏的数据)

C# 编写Arraylist<;字节[]>;到文件生成无效结果(损坏的数据),c#,list,arraylist,C#,List,Arraylist,我正在测试将压缩数据写入文件的过程。我遇到了一些“麻烦”,我有一个包含在Arraylist/list中的字节[]的压缩列表。但似乎只有列表版本起作用。arraylist生成一个具有未知编解码器(可能是由于数据损坏)的文件(本例中为wmv) 原始文件大小:294mb 列表文件大小:294mb Arraylist文件大小:304mb?????(额外的10mb是从哪里来的?) 没有抛出异常,我似乎无法找到问题的根源。有人能帮我吗 两个列表都从同一个流接收数据: int chunkS

我正在测试将压缩数据写入文件的过程。我遇到了一些“麻烦”,我有一个包含在Arraylist/list中的字节[]的压缩列表。但似乎只有列表版本起作用。arraylist生成一个具有未知编解码器(可能是由于数据损坏)的文件(本例中为wmv)

  • 原始文件大小:294mb
  • 列表文件大小:294mb
  • Arraylist文件大小:304mb?????(额外的10mb是从哪里来的?)
没有抛出异常,我似乎无法找到问题的根源。有人能帮我吗

两个列表都从同一个流接收数据:

        int chunkSize = 1024;
        byte[] chunk = new byte[chunkSize];
        using (FileStream fileReader = new FileStream(@"C:\XXXX\someMovie.wmv", FileMode.Open, FileAccess.Read) )
        {


            BinaryReader binaryReader = new BinaryReader(fileReader);
            int bytesToRead = (int)fileReader.Length;
            do
            {
                chunk = binaryReader.ReadBytes(chunkSize);
                byteList.Add(chunk);
                bytesToRead -= chunk.Length;
            } while (bytesToRead > 0);

        }
正在工作的列表版本
(byteList=List)

函数:ObjectToByteArray()(用于将
对象
强制转换为
字节[]


注意:我知道我可以使用
列表解决方案
忘记arraylist
。但我只是好奇我可能做错了什么….

问题是,您正在使用
序列化方法将
对象
转换为
字节[]
。serialize方法可用于序列化任何内容,而不仅仅是字节数组。因此,它用额外的元数据将数据打包以允许解码(您可以对该数据进行反序列化,它将知道如何将其反序列化为字节数组)

这些额外的数据显然不在原始字节数据中,因此会损坏文件


您可以将
对象
直接强制转换为字节数组。然而,
List
通常比
Arraylist
更受欢迎,所以我只会使用
List

一件绝对错误的事情是
bytesToRead-=chunkSize
应该是
bytesToRead-=chunk必须减去实际读取的字节数,而不是要读取的字节数。@MArius Bancila。说得好,我还没注意到呢!我相应地调整了代码!问题似乎是,当您序列化字节数组时,为什么不能将
byteList[i]
转换为
byte[]
?@t.Kiley您的权利!当直接铸造时,它确实可以正常工作。你知道我在我的
ObjectToByteArray
中可能做错了什么吗?@N55PEC太好了,我会写一个答案来解释你的为什么不起作用:)
        using (System.IO.FileStream _FileStream = new System.IO.FileStream(@"C:\XXXX\listTest.wmv", System.IO.FileMode.Create, System.IO.FileAccess.Write))
        {
            for (int i = 0; i < byteList.Count; i++)
            {
                _FileStream.Write(byteList[i], 0, byteList[i].Count());
            }
        }
        using (System.IO.FileStream _FileStream = new System.IO.FileStream(@"C:\SIDJRGD\Zone afbakenen_2.wmv", System.IO.FileMode.Create, System.IO.FileAccess.Write))
        {
            for (int i = 0; i < byteList.Count; i++)
            {
                _FileStream.Write(ObjectToByteArray(byteList[i]), 0, ObjectToByteArray(byteList[i]).Length);
            }
        }
private static byte[] ObjectToByteArray(Object obj)
{
    if (obj == null)
        return null;
    BinaryFormatter bf = new BinaryFormatter();
    MemoryStream ms = new MemoryStream();
    bf.Serialize(ms, obj);
    return ms.ToArray();
}