C fread如何读取二进制文件中的不同数据块?

C How fread reads different data blocks in a binary file?

我正在将一些 C 代码移植到 C#,但我对 C 知之甚少,但我很灵活,可以学习新的编程语言。无论如何,我无法从我正在移植的代码中找出确切的行为。

我已经阅读了有关 fread() 和网上的内容。

  fread(&(targetObj->data), sizeof(TestObj), 1, file);

现在,文件是一个包含大量数据的大二进制文件。

我想知道如何在 C# 中执行此操作。 让我解释一下:

我认为那行代码是这样做的:

我不明白的是:

我有一个很大的二进制文件,它实际读取的是什么?在某处 headers 定义了无符号短数据块的写入位置?

object 的二进制文件从哪里获取?我怎么知道如何从 C# 中的二进制文件中读回?也许 C 知道在哪里选择那个单一的无符号短,但我不知道在 C#

例如,如果该二进制文件中保存了 40 个无符号短裤,上面的 C 代码行只读取第一个吗?

如果我这样做

fread(&(targetObj->data), sizeof(TestObj), 5, file);

testObj->data应该是5个无符号short的数组? 代码将读取它在整个二进制文件中找到的前 5 个无符号短裤?

我无法解决这个问题,但我需要知道 C 如何识别一个大二进制文件中的无符号短整型,我不知道它的内容,也不知道我该如何说C# 从该文件中读取第一个 C unsigned short

来自man fread

 size_t
 fread(void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);

 The function fread() reads nitems objects, each size bytes long, from the stream pointed to by stream, storing them at the location given by ptr.

sizeof(short) 由编译器根据

解析

并且 C 不会对您进行任何漂亮的转换。读取的正是sizeof(short)个字节,这些字节被放入TestObj个变量中。它是否正确是实施者的责任。您需要自行管理偏移量、集合大小等。

fread 从流中的当前位置读取另请参阅 ftell 和 fseek。 C# 中的等价物是 Stream.Read

fread 只是从当前文件游标位置读取指定数量的字节,并使文件游标前进(或 "file pointer",但不要与 C 指针混淆)。

因此,如果 sizeof(TestObj)2,它将读取两个字节并将它们放入 &(targetObj->data) 指向的位置,没有边界检查,并且无论您之间的任何差异体系结构字节序和文件协议字节序。请注意,这种方法不是一种独立于平台的解析包含二进制形式数字的文件的方法,因为与它在文件中的存储方式相比,数字在您的机器上的存储方式可能不同(由您尝试的二进制协议的设计者)阅读)。

在 C# 中,您可以通过手动指定 struct packing and field placement 来实现类似的目的,尽管代码会遇到与 C 代码相同的问题。