C++扇区对齐读取

标签 c++ windows readfile

我问这个是因为我在读取原始设备时无法理解扇区对齐读取。

让我们假设在 Windows 中,我们正在使用 ReadFile()从设备读取 x 个字节的 C 函数。

我知道我们只能读取扇区对齐的数据,但最近我发现了 SetFilePointer()函数,它允许我们将指针放在我们之前用 CreateFile() 打开的设备的 x 字节中.

我的问题是,如果我们需要读取扇区对齐数据,如果我们使用 SetFilePointer()例如像这样:

SetFilePointer(device, 12, NULL, FILE_BEGIN);

(设备是现有设备的 HANDLE,为了本示例,我们假设它是 USB 笔式驱动器),在该示例中,我们设置了一个指向从 FILE_BEGIN 开始的第 12 个字节的指针。 .

如果我要从第 12 个字节开始读取相当于一个扇区(512 字节)的内容,我是否需要像这样进行读取功能:

ReadFile(device, sector, (512 - 12), &bytesRead, NULL)

或者像这样:

ReadFile(device, sector, 512, &bytesRead, NULL)

无论如何,谢谢!

最佳答案

My question is, if we need to read sector aligned data, if we use SetFilePointer() for example like this:

SetFilePointer(device, 12, NULL, FILE_BEGIN);

...那么您将不再读取扇区对齐数据,您将在 ReadFile 调用中收到错误 87。读取扇区对齐数据并不仅仅意味着您必须读取扇区大小的 block ,而且您必须始终读取从扇区边界开始的 block 。

您必须寻找包含您感兴趣的字节的扇区(因此,position/sector_size*sector_size),读取整个扇区并从您读取的数据中提取您感兴趣的字节。

关于C++扇区对齐读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44946890/

相关文章:

c++ - 添加图像到 QQuickView

c++ - 如何通过 Cython 处理 C++ 包装中的双指针

windows - Windows 上的 GNU Emacs : unable to apply init file changes and to type tilde symbol

php - 更改读取文件文本输出的颜色

c++ - 文本文件中的 BellmanFord 未提供与手动输入相同的输出

不同 DLL 甚至线程之间的 C++ 安全字符串

c++ - C++中错误的计算方法

windows - 在 Windows 上使用 Theano : missing lazylinker_ext. pyd

c# - 是否有用于文件的 ICopyHook.CopyCallback 或替代品?

node.js - Node.js 如何使用单进程实现异步回调