如何在不知道下一个值的数据类型的情况下读取二进制文件?

时间:2015-12-19 08:36:49

标签: c# .net binary

我想阅读其中包含charStringInteger的二进制文件。我该怎么读?我试图读取我的文件我的下面的函数,它工作正常,但如何在不知道下一个值的数据类型的情况下读取文件?

static void read() // Read Function 
{
    FileStream a = new FileStream("bin.txt", FileMode.Open);
    BinaryReader b = new BinaryReader(a);

    int pos = 0;
    Console.WriteLine(b.ReadChar());
    Console.WriteLine(b.ReadChar());
    Console.WriteLine(b.ReadString());
    Console.WriteLine(b.ReadInt32());
}

static void write() // Write Function This What My File consist Of Data. 
{
    BinaryWriter al = new BinaryWriter(File.Create("bin.txt"));
    char a = 'l';
    al.Write(a);
    a = 'p';
    al.Write(a);
    string l = "loremm";
    al.Write(l);
    al.Write(1233);
    al.Close();
}

1 个答案:

答案 0 :(得分:2)

成功的二进制文件类型具有数据顺序的规则。

这些可以是基于结构的。例如。存档格式可以在文件数据之前

struct {
    char name[256];
    size_t uncompressedSize;
    size_t compressedsize;
    short  compressionmethod;
};

或C#

using System.Runtime.InteropServices;


[StructLayout(LayoutKind.Explicit, Size = 276, Pack = 1)]
public struct NewStuff
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
    [FieldOffset(0)]
    public string Name;

    [MarshalAs(UnmanagedType.U8)]
    [FieldOffset(256)]
    public UInt64 uncompressedSize;

    [MarshalAs(UnmanagedType.U8)]
    [FieldOffset(264)]
    public UInt64 compressedSize;


    [MarshalAs(UnmanagedType.U2)]
    [FieldOffset(272)]
    public UInt16 compressionMethod;
}

这允许读取数据块,然后知道后续数据的类型。

或者,您可以标记'数据,例如。

Inttag; intvalue; stringtag;字符串值

这可以包括'命名'物品例如'文件数据'然后命名下一条记录。