C++扇区对齐读取
C++ sector aligned read
我问这个是因为我在读取原始设备时无法理解扇区对齐读取。
假设在 Windows 机器中,我们正在使用 ReadFile()
C 函数从设备读取 x 个字节。
我知道我们只能读取扇区对齐的数据,但最近我发现了 SetFilePointer()
函数,它允许我们将指针放在我们之前用 CreateFile()
打开的设备的 x 字节中.
我的问题是,如果我们需要读取扇区对齐数据,如果我们使用 SetFilePointer()
例如这样:
SetFilePointer(device, 12, NULL, FILE_BEGIN);
(设备是现有设备的 HANDLE
,为了这个例子,我们假设它是一个 USB 笔式驱动器),在那个例子中,我们设置了一个指向第 12 个字节的指针,从 FILE_BEGIN
.
如果我要从第 12 个字节开始读取相当于一个扇区(512 字节)的内容,我是否需要像这样进行读取功能:
ReadFile(device, sector, (512 - 12), &bytesRead, NULL)
或者像这样:
ReadFile(device, sector, 512, &bytesRead, NULL)
无论如何,谢谢!
嗯,这取决于..
如果您希望缓冲区中的内容代表设备的整个扇区,并使用结构*或字节偏移量对其进行映射 - 通常就是这样做的。那么发送到 SetFilePointer 的偏移量应该与扇区大小对齐,然后读取扇区大小的缓冲区。所以 SetFilePointer(0) -> ReadFile(512 bytes)
如果您不关心,只想要字节 12-16,SetFilePointer(12) -> Read(4bytes)。
我会选择解决方案 1,因为它可能会使代码在较长的 运行.
中更易于阅读和维护
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。读取扇区对齐数据并不仅仅意味着您必须读取扇区大小的块,而且您必须始终读取从扇区边界开始的块。
您必须查找包含您感兴趣的字节的扇区(因此,position/sector_size*sector_size
),读取整个扇区并从您读取的数据中提取您感兴趣的字节。
我问这个是因为我在读取原始设备时无法理解扇区对齐读取。
假设在 Windows 机器中,我们正在使用 ReadFile()
C 函数从设备读取 x 个字节。
我知道我们只能读取扇区对齐的数据,但最近我发现了 SetFilePointer()
函数,它允许我们将指针放在我们之前用 CreateFile()
打开的设备的 x 字节中.
我的问题是,如果我们需要读取扇区对齐数据,如果我们使用 SetFilePointer()
例如这样:
SetFilePointer(device, 12, NULL, FILE_BEGIN);
(设备是现有设备的 HANDLE
,为了这个例子,我们假设它是一个 USB 笔式驱动器),在那个例子中,我们设置了一个指向第 12 个字节的指针,从 FILE_BEGIN
.
如果我要从第 12 个字节开始读取相当于一个扇区(512 字节)的内容,我是否需要像这样进行读取功能:
ReadFile(device, sector, (512 - 12), &bytesRead, NULL)
或者像这样:
ReadFile(device, sector, 512, &bytesRead, NULL)
无论如何,谢谢!
嗯,这取决于..
如果您希望缓冲区中的内容代表设备的整个扇区,并使用结构*或字节偏移量对其进行映射 - 通常就是这样做的。那么发送到 SetFilePointer 的偏移量应该与扇区大小对齐,然后读取扇区大小的缓冲区。所以 SetFilePointer(0) -> ReadFile(512 bytes)
如果您不关心,只想要字节 12-16,SetFilePointer(12) -> Read(4bytes)。
我会选择解决方案 1,因为它可能会使代码在较长的 运行.
中更易于阅读和维护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。读取扇区对齐数据并不仅仅意味着您必须读取扇区大小的块,而且您必须始终读取从扇区边界开始的块。
您必须查找包含您感兴趣的字节的扇区(因此,position/sector_size*sector_size
),读取整个扇区并从您读取的数据中提取您感兴趣的字节。