Как читать двоичный файл с помощью 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#, и записать его обратно после редактирования?
3 ответа:
На самом деле есть более приятный способ сделать это, используя тип
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); } }
См. пример ниже.
Надеюсь, это поможет...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; }
Вы можете использовать FileStream для чтения файла-используйте
File.Open
метод, чтобы открыть файл и получитьFileStream
- смотрите здесь для получения дополнительной информации