C# 如何在C中使用FileStream编写文件头#
我正在创建自己的视频文件格式,并希望写出文件头和帧头 目前,我只定义了这样的占位符:C# 如何在C中使用FileStream编写文件头#,c#,.net,header,filestream,file-format,C#,.net,Header,Filestream,File Format,我正在创建自己的视频文件格式,并希望写出文件头和帧头 目前,我只定义了这样的占位符: byte[] fileHeader = new byte[FILE_HEADER_SIZE * sizeof(int)]; byte[] frameHeader = new byte[FRAME_HEADER_SIZE * sizeof(int)]; 我使用以下文件头将它们写出来: fsVideoWriter.Write(fileHeader, 0, FILE_HEADER_SIZE); 对于帧头,这是:
byte[] fileHeader = new byte[FILE_HEADER_SIZE * sizeof(int)];
byte[] frameHeader = new byte[FRAME_HEADER_SIZE * sizeof(int)];
我使用以下文件头将它们写出来:
fsVideoWriter.Write(fileHeader, 0, FILE_HEADER_SIZE);
对于帧头,这是:
fsVideoWriter.Write(frameHeader, 0, FRAME_HEADER_SIZE);
现在我确实需要正确使用这些标题,我不确定这是否是写入它们的最方便的方式,因为我不确定在我需要的各个字段中读取标题中的单独变量是否容易
我想做如下事情:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct FileHeader
{
public int x;
public int y;
public int z;
// etc. etc.
}
我想以这样一种方式来定义它,随着文件格式的发展,我可以轻松地升级(即包括版本号)。这是定义文件/帧头的推荐方法吗?如果是,我应该如何使用.NET FileStream类读/写它?如果这不是推荐的方法,请建议正确的方法,因为可能有人已经创建了一个通用的视频文件相关类来处理这类事情?您可能想尝试该类。但它或多或少是一个黑匣子。如果需要精确控制文件格式,您可以编写自己的格式化程序,并使用它序列化头对象。我决定采用以下解决方案: 写出文件头
public static bool WriteFileHeader(FileStream fileStream, FileHeader fileHeader)
{
try
{
byte[] buffer = new byte[FILE_HEADER_SIZE];
GCHandle gch = GCHandle.Alloc(buffer, GCHandleType.Pinned);
Marshal.StructureToPtr(fileHeader, gch.AddrOfPinnedObject(), false);
gch.Free();
fileStream.Seek(0, SeekOrigin.Begin);
fileStream.Write(buffer, 0, FILE_HEADER_SIZE);
return true;
}
catch (Exception ex)
{
throw ex;
}
}
public static bool ReadFileHeader(FileStream fileStream, out FileHeader fileHeader)
{
try
{
fileHeader = new FileHeader();
byte[] buffer = new byte[FILE_HEADER_SIZE];
fileStream.Seek(0, SeekOrigin.Begin);
fileStream.Read(buffer, 0, FILE_HEADER_SIZE);
GCHandle gch = GCHandle.Alloc(buffer, GCHandleType.Pinned);
Marshal.PtrToStructure(gch.AddrOfPinnedObject(), fileHeader);
gch.Free();
// test for valid data
boolean isSuccessful = IsValidHeader(fileHeader);
return isSuccessful;
}
catch (Exception ex)
{
throw ex;
}
}
读取文件头
public static bool WriteFileHeader(FileStream fileStream, FileHeader fileHeader)
{
try
{
byte[] buffer = new byte[FILE_HEADER_SIZE];
GCHandle gch = GCHandle.Alloc(buffer, GCHandleType.Pinned);
Marshal.StructureToPtr(fileHeader, gch.AddrOfPinnedObject(), false);
gch.Free();
fileStream.Seek(0, SeekOrigin.Begin);
fileStream.Write(buffer, 0, FILE_HEADER_SIZE);
return true;
}
catch (Exception ex)
{
throw ex;
}
}
public static bool ReadFileHeader(FileStream fileStream, out FileHeader fileHeader)
{
try
{
fileHeader = new FileHeader();
byte[] buffer = new byte[FILE_HEADER_SIZE];
fileStream.Seek(0, SeekOrigin.Begin);
fileStream.Read(buffer, 0, FILE_HEADER_SIZE);
GCHandle gch = GCHandle.Alloc(buffer, GCHandleType.Pinned);
Marshal.PtrToStructure(gch.AddrOfPinnedObject(), fileHeader);
gch.Free();
// test for valid data
boolean isSuccessful = IsValidHeader(fileHeader);
return isSuccessful;
}
catch (Exception ex)
{
throw ex;
}
}
我也对帧头使用了类似的方法。基本上,我的想法是使用字节缓冲区和封送处理。我想我可以使用Marshal.PtrToStructure()和Marshal.StructureToPtr(),但我希望避免使用非托管代码。我只想确保我的头以正确的顺序发出和返回。FileHeader输入类型是什么?您是单独定义了一个类还是一个系统库?谢谢我相信是我自己定义的。