C ++扇区对齐读取

时间:2017-07-06 10:51:30

标签: c++ windows readfile

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

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

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

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

SetFilePointer(device, 12, NULL, FILE_BEGIN);

(设备是现有设备的HANDLE,为了这个例子,我们假设它是一个USB笔式驱动器),在这个例子中我们设置一个指针,指向从{{1开始的第12个字节}}

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

FILE_BEGIN

或者像这样:

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

无论如何,谢谢!

2 个答案:

答案 0 :(得分:2)

  

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

SetFilePointer(device, 12, NULL, FILE_BEGIN);

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

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

答案 1 :(得分:1)

嗯,这取决于..

  • 如果您希望缓冲区中的内容代表设备的整个扇区,并使用结构*或字节偏移进行映射 - 通常它是如何完成的。那么发送到SetFilePointer的偏移应该在扇区大小上对齐,然后读取扇区大小的缓冲区。所以SetFilePointer(0) - > ReadFile(512字节)

  • 如果你不在乎,只想要字节12-16,SetFilePointer(12) - >读(4字节)。

我会选择解决方案1,因为从长远来看,这可能会使代码更容易阅读和维护。