Как прочитать двоичный файл с помощью С#?

У меня есть бинарный файл. Я понятия не имею, как читать этот двоичный файл с помощью С#.

Определение записей в двоичном файле, как описано в 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........
}

Как мне прочитать двоичный файл, содержащий эти записи на С#, и записать его обратно после редактирования?


person User13839404    schedule 28.03.2011    source источник
comment
Код, который вы разместили, выглядит для меня как C или C++. В С# нет typedef.   -  person John M Gant    schedule 28.03.2011
comment
@John: Я думаю, что ОП описывает файл на языке, который он знает, чтобы мы могли помочь ему открыть файл на C #.   -  person Bruno Brant    schedule 28.03.2011
comment
Я полагаю, вы знаете структуру файла? В противном случае у вас возникнут проблемы с интерпретацией содержания :)   -  person Tony    schedule 29.03.2011


Ответы (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);
        }
    }
person BrokenGlass    schedule 28.03.2011
comment
+1 ...проверка того, что вы получите после прочтения файла Как бы вы это сделали, т.е. что вы ищете? Я полный новичок в работе с бинарными данными. - person Adrian K; 10.08.2015
comment
вы должны знать расположение двоичных данных в вашем файле, т.е. каков размер записи, каковы поля в каждой записи и каков их размер. - person BrokenGlass; 10.08.2015

См. образец ниже.

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

Надеюсь, это поможет...

person Kenn    schedule 28.03.2011

Вы можете использовать FileStream для чтения файла — используйте File.Open метод, чтобы открыть файл и получить FileStream — см. здесь дополнительные подробности

person Rafal Spacjer    schedule 28.03.2011