gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:54:47 25 4
gpt4 key购买 nike

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

我读过 fread()和网络上。

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

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

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

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

  • TestObj 是一个无符号短
  • 读取 1 次 大小为 TestObj(unsigned short) 的数据 block
  • 将其从文件(指向文件系统上的二进制文件的指针)读入 targetObj->data

我不明白的是:

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

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

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

如果我这样做了

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

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

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

最佳答案

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

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

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

关于C fread如何读取二进制文件中的不同数据 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46520799/

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