【发布时间】:2013-12-16 02:21:27
【问题描述】:
我有一个二进制文件,它是由一个用 C 语言编写的开源应用程序创建的。由于它是开源的,因此我可以看到数据在写入文件时的结构。问题是我不懂 C,但我至少可以大致了解在声明结构时发生了什么。但从我在其他帖子中看到的情况来看,这并不像在 C# 中创建一个与 C 中的数据类型相同的结构那么简单。
我发现这篇帖子https://stackoverflow.com/a/3863658/201021 有一个用于翻译结构的类,但是(据我所知)您需要在 C# 中正确声明该结构才能使其工作。
我读过MarshalAs attribute 和StructLayout attribute。我主要了解您将如何使用它们来控制数据类型的物理结构。我认为我缺少的是细节。
我并不是要求某人将 C 数据结构转换为 C#。我真正想要的是一些指向信息的指针,这些信息将帮助我自己弄清楚如何去做。我有另一个格式稍有不同的二进制文件可供阅读,因此非常感谢您了解有关此主题的一般知识。
如何将 C 数据结构转换为允许您从文件中读取数据类型的 C# 结构?
注意事项: 具体来说,我正在尝试读取 Tomato 路由器固件输出的 rstats 和 cstats 文件。此文件包含带宽使用数据和 ip 流量数据。
数据结构的C代码是(来自rstats.c):
#define MAX_COUNTER 2
#define MAX_NSPEED ((24 * SHOUR) / INTERVAL)
#define MAX_NDAILY 62
#define MAX_NMONTHLY 25
typedef struct {
uint32_t xtime;
uint64_t counter[MAX_COUNTER];
} data_t;
typedef struct {
uint32_t id;
data_t daily[MAX_NDAILY];
int dailyp;
data_t monthly[MAX_NMONTHLY];
int monthlyp;
} history_t;
typedef struct {
char ifname[12];
long utime;
unsigned long speed[MAX_NSPEED][MAX_COUNTER];
unsigned long last[MAX_COUNTER];
int tail;
char sync;
} speed_t;
【问题讨论】:
-
将 struct 从 C 转换为 C# 的一种更简单的方法是,您可以使用 thrift 或 avro 等语言独立的序列化库,并在它们之间转换数据。
标签: c# c data-structures