C ++部门alignment阅读

我问这个,因为我在阅读原始设备时无法理解部门alignment的阅读。

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

我知道我们只能读取扇区alignment的数据,但是最近我发现了SetFilePointer()函数,它允许我们在先前用CreateFile()打开的设备的x个字节中放置一个指针。

我的问题是,如果我们需要读取扇区alignment的数据,如果我们使用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) 

无论如何,谢谢!

Solutions Collecting From Web of "C ++部门alignment阅读"

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

 SetFilePointer(device, 12, NULL, FILE_BEGIN); 

…那么您不再读取扇区对齐的数据,并且您将在ReadFile调用中得到错误87。 读取扇区对齐的数据并不意味着你必须读取扇区大小的块,但是你必须始终读取以扇区边界开始的块。

你必须寻找包含你感兴趣的字节的部分( position/sector_size*sector_size ),读取整个部分并从你读的数据中提取你感兴趣的字节。

这得看情况..

  • 如果你想要什么在你的缓冲区来表示设备的整个扇区,并使用struct *或byte偏移量映射它 – 通常是这样做的。 那么发送给SetFilePointer的偏移量应该按照扇区大小对齐,然后读取扇区大小的缓冲区。 所以SetFilePointer(0) – > ReadFile(512字节)

  • 如果你不在意,只需要12-16字节,SetFilePointer(12) – > Read(4字节)。

我会去解决方案1,因为它可能会使代码更容易阅读和长期维护。