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