写入数组列表文件产生无效结果(损坏的数据)
本文关键字:结果 无效 损坏 数据 文件 列表 数组 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-solution
和forget about the arraylist
。但我只是好奇我可能做错了什么....
问题是您正在使用Serialize
方法将Object
转换为byte[]
。serialize方法对于序列化任何东西都很有用,而不仅仅是字节数组。因此,它将数据与额外的元数据打包在一起以允许解码(您可以反序列化该数据,并且它知道将其反序列化到字节数组中)。
这个额外的数据显然不在您的原始字节数据中,因此这会损坏文件。
可以直接将Object
强制转换为字节数组。然而,List<T>
通常比Arraylist
更受欢迎,所以我只使用List<byte[]>
。