2013-04-20 64 views
1

我有一個包含二進制數據與這個結構相匹配的格式的文件:讀取二進制數據轉換成AC#結構

struct MyStruct { 
    UInt32 count; 
    UInt32[] items; 
} 

二進制數據可以是任何長度,可以有任意數量的項目,但項數在count中定義。使用Marshal.PtrToStructure似乎不允許這種二進制格式,其中有可變數量的項目?使用屬性可以設置項目數組的大小,但這必須是一個常數,是否無法告訴它在讀取數據時查看count?我想過在XML中定義格式,並用它來讀取結構與我自己的代碼,但這將是很多重複的數據,如果文件格式改變,我不得不改變XML和結構,而不僅僅是結構。

我想過在items字段上使用自定義屬性,並編寫自己的代碼來讀取數據,但爲了枚舉結構的字段,我必須使用Reflection?這很慢?

(我也可以手動讀它自己,但我已經修整結構下來的問題,並希望沒有改變閱讀代碼,如果結構的變化)上的一個實例

+0

我假設你想避免XML由於其額外的開銷(在解析和文件大小);解析含有這些'MyStruct' 10000可以在單個線來完成的XML文件: '列表數據=(列表)新的XmlSerializer(typeof運算(列表))反序列化(File.OpenText(「MyStructs。 xml「));' – 2013-04-21 00:59:25

+0

該數據是一個預先存在的二進制文件,我無法控制數據的存儲方式。 – 2013-04-21 01:32:04

回答

0

使用.Read()方法Stream,讀入byte[],然後使用System.BitConverter.ToUInt32(bytearray, startindex)將您的二進制數據轉換爲uint32的形式。

+0

我沒有遇到讀取數據的麻煩,這是我如何以減少信息重複的方式讀取數據,速度不是很慢,並且不需要更改格式更改時讀取數據的代碼。 – 2013-04-20 20:15:45