2011-03-28 37 views
2

我有一個二進制文件。我不知道如何使用C#讀取這個二進制文件。如何使用c#讀取二進制文件?

的二進制文件中記錄的定義在C++中描述的是:

#define SIZEOF_FILE(10*1024) 
//Size of 1234.dat file is: 10480 + 32 byte (32 = size of file header) 
typedef struct FileRecord 
{ 
WCHAR ID[56]; 
WCHAR Name[56]; 
int Gender; 
float Height; 
WCHAR Telephne[56]; 
and........ 
} 

如何讀取包含在C#中的那些記錄的二進制文件,並對其進行編輯後寫回信嗎?

+0

你張貼看起來像C或C++對我的代碼。在C#中沒有'typedef'。 – 2011-03-28 18:45:29

+2

@John:我認爲OP使用他知道的語言描述文件,以便我們可以幫助他用C#打開文件。 – 2011-03-28 19:07:46

+0

我假設你知道文件的結構?否則,你將無法解釋內容:) – Tony 2011-03-28 20:45:09

回答

5

實際上,有我沒有測試過了一個與struct類型和StructLayout直接映射到二進制文件中的數據結構(一個更好的方式實際的映射,但它是尋找它和檢查您讀取該文件得到的是什麼)的問題:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)] 
public struct FileRecord 
{ 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 56)] 
    public char[] ID; 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 56)] 
    public char[] Name; 
    public int Gender; 
    public float height; 
    //... 
} 

class Program 
{ 
    protected static T ReadStruct<T>(Stream stream) 
    { 
     byte[] buffer = new byte[Marshal.SizeOf(typeof(T))]; 
     stream.Read(buffer, 0, Marshal.SizeOf(typeof(T))); 
     GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned); 
     T typedStruct = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T)); 
     handle.Free(); 
     return typedStruct; 
    } 

    static void Main(string[] args) 
    { 
     using (Stream stream = new FileStream(@"test.bin", FileMode.Open, FileAccess.Read)) 
     { 
      FileRecord fileRecord = ReadStruct<FileRecord>(stream); 
     } 
    } 
+0

+1「...檢查你從閱讀文件中得到什麼」你會怎麼做,即你在找什麼?我是一個使用二進制數據的完全新手。 – 2015-08-10 00:13:50

+0

您必須知道文件中二進制數據的佈局,即什麼是記錄大小,每條記錄中的字段是什麼以及它們的大小。 – BrokenGlass 2015-08-10 02:42:33

0

您可以使用FileStream讀取文件 - 使用File.Open方法來打開文件,並得到一個FileStream - 看看這裏的更多details

4

請參見下面的示例。

public byte[] ReadByteArrayFromFile(string fileName) 
{ 
    byte[] buff = null; 
    FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read); 
    BinaryReader br = new BinaryReader(fs); 
    long numBytes = new FileInfo(fileName).Length; 
    buff = br.ReadBytes((int)numBytes); 
    return buff; 
} 

希望幫助...