在C#中编写一个二进制文件,由C程序读取,带指针?

时间:2009-11-05 19:38:57

标签: c# c file pointers binary

我正在将一些生成二进制文件的旧C代码移动到我们的C#系统中。问题是,生成的二进制文件仍然需要被另一个旧的C程序读取。

原始代码将几个结构输出到二进制文件,其中许多结构包含链接列表,带有* next指针。

如何在C#中编写这些内容,以便原始程序仍能读取它们?

旧的C代码一次读取和写入整个结构的文件,包括freads和fwrites,即

fread ( &file, sizeof ( struct file_items ), 1, hdata.fp );

我找不到关于fwrite如何输出指针等的大量信息。

5 个答案:

答案 0 :(得分:4)

如果旧代码正在编写指向文件的指针,那么你很难处理编写得很糟糕的代码。那些指针对于读取该文件的任何其他进程都没有意义......

此外,使用单个fread()读取整个结构是一个坏主意,因为不同的编译器可能会以不同方式填充这些结构(因此,一个应用程序编写的结构可能与另一个应用程序读取的结构不同)。

答案 1 :(得分:3)

如果您的代码依赖于读取和写入文件的指针值,那么它就会被破坏。每次运行程序时,内存布局都可能略有不同。

不是编写指针,而应该在写入时将指针转换为文件偏移量,并将文件偏移量转换回读取指针。

(这适用于C,C ++和C#)

答案 2 :(得分:1)

用C或任何其他语言阅读后,指针将毫无意义。我假设读取后重建指针结构。这意味着您可以在阅读/写作时将它们视为填充物。

在.NET中,流只接受bytebyte[]作为数据类型,因此您必须将结构转换为该格式或从该格式转换。

一种方法是编写自定义代码,按顺序读取/写入字段。给你最大的控制权,但这是很多工作。

另一种方法是将你的结构映射到byte []批发,我会找一个例子。

答案 3 :(得分:0)

你可以(正确地)将指针写入磁盘的唯一方法是使用based addressing之类的东西:

  

包含的链接列表   基于指针的指针可以是   保存到磁盘,然后重新加载到   在记忆中的另一个地方,与   指针仍然有效。

在C#中处理它将非常困难,并且在序列化期间需要某种映射层。

答案 4 :(得分:0)

指针指的是一个内存位置,当你将一个指针存储在一个文件中时,它是没有意义的,它指的是短暂的东西。因此,要么在此应用程序中无关紧要,因为引用的数据已被丢弃,或者您没有正确说明格式。通常在这种情况下,您将应用“序列化”,以便指向的数据也以这样的方式存储在文件中,即原始数据及其指向的内容可以在以后重建(“反序列化”)

C和C#中的文件存储没有根本区别 - 这与语言无关,但是结构打包可能存在差异,所以只存储结构总是一个坏主意(结构打包甚至可以在C之间变化)编译器)。当然,您还需要意识到C#中的char类型是16位而不是8.您需要让现有存储格式成为规范,然后使用序列化在C#中实现它以避免差异问题在结构实施中。