gpt4 book ai didi

c# - 如何从C#读取C程序生成的数据文件?

转载 作者:行者123 更新时间:2023-11-30 15:38:29 26 4
gpt4 key购买 nike

我有一个 C 程序,定义了以下结构:

typedef struct{
DWORD id;
char name[256];
}ROW;


typedef struct{
DWORD Prev;
DWORD Next;
WORD ItemCount;
struct ROW Item[256];
} PAGE;

...在某个时刻,程序会填充 PAGE 结构并将其写入磁盘文件。

现在,我需要从 C# 程序读取此文件,但我不知道如何在 C# 中定义等效的类,我尝试过的所有操作要么无法编译,要么引发异常。在 C 中,这是一个非常琐碎的任务,很可能在 C# 中也是如此,但是我是 C# 新手,还没有找到关于如何正确执行此操作的明确解释。

最佳答案

我个人会使用BinaryReader这里。原因是它允许您定义一组类型来表示这些结构,这在 C# 中感觉很干净。如果您要使用Marshal.PtrToStructure那么您就不得不定义在 C# 中感觉笨拙的互操作类型。

您声明结构已打包,这很好。对齐的结构使事情变得更加困难,因为您必须了解编译器如何布局结构。为了存储到磁盘,通常应避免对齐结构。

我可能会定义这样的类型:

public struct Row
{
public uint id;
public string name;
}

public struct Page
{
public uint prev;
public uint next;
public Row[] items;
}

如果您愿意,可以使用类。或List<Row> 。这完全取决于你。

然后使用如下方法读取文件:

public static Page ReadPage(BinaryReader reader)
{
Page page;
page.prev = reader.ReadUInt32();
page.next = reader.ReadUInt32();
ushort count = reader.ReadUInt16();
page.items = new Row[count];
for (int i=0; i<count; i++)
{
page.items[i].id = reader.ReadUInt32();
page.items[i].name = Encoding.ASCII.GetString(reader.ReadBytes(256));
}
// skip past the unused rows
reader.ReadBytes((256+sizeof(uint))*(256-count));
}

我假设使用 ASCII 编码。但也许它是 UTF-8 或 ANSI。我假设字符串以空终止符结尾,但实际上并未编码任何空终止符检测。我希望你能够做到这一点!

关于c# - 如何从C#读取C程序生成的数据文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21731697/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com