写入数组列表文件产生无效结果(损坏的数据)

本文关键字:结果 无效 损坏 数据 文件 列表 数组 byte | 更新日期: 2023-09-27 18:17:41

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

  • 原始文件大小:294 mb
  • 列表文件大小:294mb
  • Arraylist filessize: 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);
        }

working List-Version (byteList = List<byte[]>):

        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());
            }
        }

NOT-working Arraylist-Version (byteList = Arraylist):

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

函数:ObjectToByteArray()(用于将Object转换为byte[])

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();
}

注意:我知道我可以使用List-solutionforget about the arraylist。但我只是好奇我可能做错了什么....

写入数组列表<byte[]>文件产生无效结果(损坏的数据)

问题是您正在使用Serialize方法将Object转换为byte[]。serialize方法对于序列化任何东西都很有用,而不仅仅是字节数组。因此,它将数据与额外的元数据打包在一起以允许解码(您可以反序列化该数据,并且它知道将其反序列化到字节数组中)。

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

可以直接将Object强制转换为字节数组。然而,List<T>通常比Arraylist更受欢迎,所以我只使用List<byte[]>