2011-08-25 58 views
0

在這種情況下的二進制文件與基於一個結構是有可能有依賴於在c#另一個構件

struct fileformat 
    { 
     struct mask 
     { 
       bool mem1present 
       bool mem2present 
       bool mem3present 
       //5 bits unused 
      } 
      //member only written in file if mem1present is true 
      byte mem1present 
      //member only written in file if mem2present is true 
      byte mem1present 
      //member only written in file if mem3present is true 
      byte mem1present 
    } 

文件格式寫入的動態結構成員這可能在C#中實現

+0

你用什麼來將結構寫入文件? –

+0

我已經試過寫一切,但如果它不動態改變你不能正確地編組數據。所以問題依然存在,甚至有可能,或者我只是在浪費時間。我沒有自己寫文件,我只是把數據拿出來。 – michael

回答

0

當然 - 你必須在某種程度上實現序列化,但你可以輕鬆地做到這一點。

目前還不清楚您使用的是什麼樣的序列化 - 如果您使用的是來自.NET的「原始」二進制序列化,您希望覆蓋GetObjectData以僅在序列化中添加相關數據,然後在受保護的構造函數採取SerializationInfoStreamingContext,反向填充來自相同數據的結構。有關詳細信息,請參閱this MSDN article

我不知道如果使用XML序列化會發生什麼情況。

如果你寫你自己的系列化(即你有一個方法,如WriteToStream),那麼你可以選擇代表你想要的東西,當然。

編輯:這聽起來像你可能有一個現有的文件格式,你需要閱讀,但你可以定義自己的類型。很容易有一個類或結構與多個成員和可能面具說什麼設置,雖然不知道更多它可能不是最好的設計。雖然你可以使用顯式佈局,使內存本效率,它可能是最簡單的辦法有不同的成員:

struct Foo 
{ 
    // Bit-set to determine which fields are actually used 
    private readonly byte mask; 

    private readonly int value1; 
    private readonly int value2; 
    private readonly int value3; 

    public Foo(byte mask, int value1, int value2, int value3) 
    { 
     this.mask = mask; 
     this.value1 = value1; 
     this.value2 = value2; 
     this.value3 = value3; 
    } 
} 

然後某處(無論是在數據類型或者沒有),這樣的:

Foo ReadFoo(Stream stream) 
{ 
    byte mask = stream.ReadByte(); 
    int value1 = 0, value2 = 0, value3 = 0; 
    if ((mask & 1) == 1) 
    { 
     // However you do that, depending on your file format 
     value1 = ReadInt32FromStream(stream); 
    } 
    if ((mask & 2) == 2) 
    { 
     // However you do that, depending on your file format 
     value2 = ReadInt32FromStream(stream); 
    } 
    if ((mask & 4) == 4) 
    { 
     // However you do that, depending on your file format 
     value3 = ReadInt32FromStream(stream); 
    } 
    return new Foo(mask, value1, value2, value3); 
} 

順便說一下,我會認真考慮一個結構是否是確實是這裏最好的方法 - 考慮用類來代替。我很少創建自己的結構。

+0

即時通訊實際上並沒有使用任何序列化,我只是從數據中讀取其中的一個字節,告訴它的數據長度,然後使用Marshall.ptrStructure一個字節數組,其開頭爲數據長度。你在c#中執行上面的sudo代碼時遇到了困難,因爲它有些動態。 – michael

+0

@michael:那麼你將無法使用'Marshal.PtrToStructure' ...你應該明確地編寫代碼來讀取/寫入流中的字節。目前還不清楚你是否遇到了IO問題,或者結構的基本佈局。 (是否有任何理由它是一個結構,而不是一個類,順便說一句?) –

+0

是的,我認爲Marshal.PtrToStructure不能用於我的情況,因爲動態。 IO是沒有問題的,它只是即時工作,如果結構的基本佈局甚至是可能的。沒有理由。它只是試圖發現他們究竟是如何做到的。我想他們也明確實施它。 – michael

0

注意:您的示例僅顯示嵌套結構類型的聲明,而不是它的一個實例。

從您的問題措詞,你需要一個實例成員。

struct fileformat 
{ 
    struct mask // type declaration only 
    { 
      bool mem1present 
      bool mem2present 
      bool mem3present 
      //5 bits unused 
     } 

     public mask mask; // <-- Member instance here 
} 

我很抱歉,如果我誤解了。也許你的結構只是將文件的結構傳遞給我們?

相關問題