2013-09-03 12 views
3

나 자신의 비디오 파일 형식을 만들고 파일 헤더와 프레임 헤더를 쓰고 싶습니다. 난 그냥 같은 정의 된 자리가 순간 C#에서 FileStream을 사용하여 파일 헤더를 쓰는 방법

:

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(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 클래스를 사용하여 읽고 쓰는 방법은 무엇입니까? 이것이 권장되는 방법이 아니라면 누군가가 이미 이런 종류의 일을 처리하는 일반적인 비디오 파일 관련 클래스를 만들었을 때 적절한 방법을 제안하십시오.

+0

Marshal.PtrToStructure() 및 Marshal.StructureToPtr()을 사용할 수 있다고 생각하지만 비 관리 코드를 사용하지 않는 것이 좋습니다. – gonzobrains

답변

1

나는 다음과 같은 솔루션에 정착 게다가. 아이디어는 기본적으로 바이트 버퍼와 마샬 러를 사용하는 것입니다.

+0

FileHeader 입력 유형이란 무엇입니까? 별도로 클래스를 정의했거나 시스템 라이브러리입니까? 감사! – nabrugir

+0

나는 내가 그것을 정의했다고 믿는다. – gonzobrains

0

BinaryFormatter 클래스를 사용해보십시오. 그러나 그것은 어느 정도 블랙 박스입니다. 파일 형식을 정확하게 제어해야하는 경우에는 자체 Formatter를 작성하고이를 사용하여 헤더 객체를 직렬화 할 수 있습니다.

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

읽기를 쓰기 :

+0

난 그냥 내 머리글 나가서 올바른 순서로 돌아와 있는지 확인하고 싶습니다. – gonzobrains