2

我正在阅读硬盘的 FAT32 条目,到目前为止,我已经通过使用 、 和 API 成功地读取了CreateFile这些ReadFile条目SetFilePointer。到目前为止,这是我的代码(用 C# 编写)。

---DLL 导入-----

[DllImport("kernel32.dll", SetLastError = true)]
        static extern IntPtr CreateFile(string lpFileName, Int32 dwDesiredAccess,
            Int32 dwShareMode, Int32 lpSecurityAttributes, Int32 dwCreationDisposition,
            Int32 dwFlagsAndAttributes, IntPtr hTemplateFile);

        [DllImport("kernel32.dll")]
        static extern bool ReadFile(IntPtr hFile, byte[] lpBuffer,
           uint nNumberOfBytesToRead, out uint lpNumberOfBytesRead, uint lpOverlapped);

        [DllImport("kernel32.dll")]
        extern static int SetFilePointer(IntPtr hFile, int lDistanceToMove, int lpDistanceToMoveHigh, uint dwMoveMethod);

        [DllImport("kernel32.dll")]
        extern static Boolean CloseHandle(IntPtr hObject);

------CODE----将在任何.NET应用程序中工作------

        int ret, nread;
        IntPtr handle;
        int s = 512;
        byte[] readbuffer = new byte[512];

    IntPtr ptr = CreateFile(@"\\.\F:", -1073741824, 3, 0, 3, 128, IntPtr.Zero);
 if (ptr != System.IntPtr.Zero)
            {
                int i = 100;
                int ret = SetFilePointer(ptr, 0, 0, 0);
                ret = SetFilePointer(ptr, 4194304, 0, 1);
                while (true)
                {
                    byte[] inp = new byte[512];
                    uint read = 0;
                    if (ret != -1)
                    {
                        ReadFile(ptr, inp, 512, out read, 0);
                        for (int k = 0; k < 16; k++)
                        {
                            string s = ASCIIEncoding.ASCII.GetString(inp, k*32, 11);
                            if (inp[k*32] == 0xE5)
                            {
                                MessageBox.Show(s);
                            }
                        }
                        //ret = SetFilePointer(ptr, 512, 0, 1);
                    }

                }
            }

上面的代码读取F:\驱动器,出于试用目的,我已将其读取第一个文件目录集群并查询每个文件条目,如果文件已被删除,则显示文件名。

但是,我想将它变成一个成熟的应用程序,为此我将不得不经常使用字节数组并将其映射到根据 FAT32 规范指定的数据结构。

如何有效地使用读取数据的字节数组?我已经使用 filestream 和 binaryreader 尝试了相同的代码并且它可以工作,但是现在假设我有一个类似的 C 结构

struct bios_data
{
byte id[3];
char name[11];
byte sectorpercluster[2];
...
}

我想在 C# 中有一个类似的数据结构,当我将数据读取到字节数组时,我想将它映射到结构中。我尝试了很多选择,但没有得到完整的解决方案。我也尝试过开设课程并进行序列化,但这也没有用。当我从 FAT 条目中读取数据时,我将使用大约 3 个类似 theese 的结构。我怎样才能最好地达到预期的结果?

4

2 回答 2

1

如果您想将二进制数据直接读入 C 风格的结构中,您可能会对本文感兴趣。他围绕 C stdio 函数编写了一个非托管包装器并与之互操作。我试过了——它确实工作得很好。直接读入 C# 中的结构很好,而且速度很快。你可以这样做:

unsafe 
{ 
 fmp3.Read<MyStruct>(&myStructVar); 
}
于 2009-07-16T13:37:28.470 回答
0

我在这个问题中给出了关于如何在字节数组和结构之间进行转换的答案。

于 2009-07-16T11:21:27.043 回答