我问这个是因为我在阅读原始设备时无法理解扇区对齐读数。
让我们假设在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)
无论如何,谢谢!
答案 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,因为从长远来看,这可能会使代码更容易阅读和维护。