我正在开发一个C#WinForms项目,我必须将以下内容转换为字节数组,然后使用FileStream
和BinaryWriter
写入二进制文件:
System.Drawing.Image image
Microsoft.DirectX.AudioVideoPlayback.Audio audio
Microsoft.DirectX.AudioVideoPlayback.Video video
然后我必须使用FileStream
和BinaryReader
从二进制文件中读取它们,并将它们转换回上述文件类型。
这里是在将它们写入二进制文件之前将它们转换为字节数组的代码:
public byte[] Image2Bytes(Image imgImage2Convert)
{
using (var ms = new MemoryStream())
{
imgImage2Convert.Save(ms, imgImage2Convert.RawFormat);
return ms.ToArray();
}
}
public byte[] Audio2Bytes(Audio audAudio2Convert)
{
var bytes = default(byte[]);
using (var memstream = new MemoryStream())
{
StreamReader reader = new StreamReader(memstream);
var buffer = new byte[512];
var bytesRead = default(int);
while ((bytesRead = reader.BaseStream.Read(buffer, 0, buffer.Length)) > 0)
memstream.Write(buffer, 0, bytesRead);
bytes = memstream.ToArray();
return bytes;
}
}
public byte[] Video2Bytes(Video vidVideo2Convert)
{
var bytes = default(byte[]);
using (var memstream = new MemoryStream())
{
StreamReader reader = new StreamReader(memstream);
var buffer = new byte[512];
var bytesRead = default(int);
while ((bytesRead = reader.BaseStream.Read(buffer, 0, buffer.Length)) > 0)
{
memstream.Write(buffer, 0, bytesRead);
}
bytes = memstream.ToArray();
return bytes;
}
}
以下是将它们转换回原始图像,音频和视频文件的方法:
public Image Bytes2Image(byte[] bytBytes2Convert)
{
MemoryStream ms = new MemoryStream(bytBytes2Convert, 0, bytBytes2Convert.Length);
Image returnImage = Image.FromStream(ms, true);
return returnImage;
}
public Audio Bytes2Audio(byte[] bytBytes2Convert)
{
string strTempFile = Path.GetTempPath() + "\\MyTempFile.mp3";
System.IO.File.WriteAllBytes(strTempFile, bytBytes2Convert);
Microsoft.DirectX.AudioVideoPlayback.Audio audConvertedAudio = Audio.FromFile(strTempFile);
DeleteTempFile(strTempFile);
return audConvertedAudio;
}
public Video Bytes2Video(byte[] bytBytes2Convert)
{
string strTempFile = Path.GetTempPath() + "MyTempFile.wmv";
File.WriteAllBytes(strTempFile, bytBytes2Convert);
Video vidConvertedVideo = Video.FromFile(strTempFile);
DeleteTempFile(strTempFile);
return vidConvertedVideo;
}
以下是三行代码,用于说明我如何将它们写入二进制文件:
bw.Write(GameInfo.bytTSImage);
bw.Write(GameInfo.bytTSAudio);
bw.Write(GameInfo.bytTSVideo);
以下是三行代码,用于演示我如何尝试从二进制文件中读取它们:
clsProjInfo.bytTSImage = br.ReadBytes((int)br.BaseStream.Length);
clsProjInfo.bytTSAudio = br.ReadBytes((int)br.BaseStream.Length);
clsProjInfo.bytTSVideo = br.ReadBytes((int)br.BaseStream.Length);
第一次尝试使用public Audio Bytes2Audio(byte[] bytBytes2Convert)
将字节数组转换回音频时发生错误:
错误是" System.IO.EndOfStreamException:无法读取超出流的末尾。"
在我尝试使用ReadInt32();
我是否正确地将文件转换为字节数组?这是我怀疑我做错的第一件事。或者br.ReadBytes((int)br.BaseStream.Length)
是从二进制文件中读取的错误方法吗?
这里有更多信息:
首先,我按顺序读取一个字符串,然后是一个整数,然后是一个字节数组:
clsProjInfo.strCreationDate = br.ReadString();
clsProjInfo.intTSMediaType = br.ReadInt32();
clsProjInfo.bytTSImage = br.ReadBytes((int)br.BaseStream.Length);
然后,在读取字节数组(clsProjInfo.bytTSImage)之后,我接下来尝试读取第二个整数:
clsProjInfo.intTSMediaType = br.ReadInt32();
当我尝试读取第二个整数时,我得到错误&#34; System.IO.EndOfStreamException:无法读取超出流的末尾。&#34;它看起来像我的BinaryReader(br)不知道它应该读取该字节数组,它应该读取下一个第二个整数。如果是这样的话,有什么更好的东西我可以用来映射字节数组的长度而不是&#34; br.ReadBytes((int)br.BaseStream.Length);&#34; < / p>
最后一行代码&#34; clsProjInfo.intTSMediaType = br.ReadInt32();&#34;当它应该读取1时,它一直读零。我猜测在读取第二个整数之前字节数组没有被完全读取。