C++部门对齐阅读
C++ sector aligned read
我问这个问题是因为当我们阅读原始设备时,我无法理解扇区对齐的阅读。
让我们假设在Windows机加工中,并且我们正在使用ReadFile()
C函数从设备读取x字节。
我知道我们只能读取扇区对齐的数据,但最近我发现了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)
无论如何,谢谢!
我的问题是,如果我们需要读取扇区对齐的数据,如果我们使用
SetFilePointer()
例如这样:SetFilePointer(device, 12, NULL, FILE_BEGIN);
......然后,您不再读取与扇区对齐的数据,并且您将在ReadFile
调用中收到错误 87。读取扇区对齐的数据不仅意味着您必须读取扇区大小的块,而且必须始终读取从扇区边界开始的块。
您必须寻找包含您感兴趣的字节的扇区(因此,position/sector_size*sector_size
),读取整个扇区并从您读取的数据中提取您感兴趣的字节。
嗯,这取决于..
-
如果您希望缓冲区中的内容表示设备的整个扇区,并使用结构*或字节偏移量对其进行映射 - 通常就是这样做的。 然后,发送到 SetFilePointer 的偏移量应与扇区大小对齐,然后读取扇区大小的缓冲区。所以设置文件指针(0) -> 读取文件(512 字节)
-
如果你不在乎,只想要字节 12-16,SetFilePointer(12) -> Read(4bytes)。
我会选择解决方案 1,因为从长远来看,它可能会使代码更易于阅读和维护。
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 64位机器上的C++内存对齐
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 使 std::vector 分配对齐内存的现代方法
- C++ cout 将双精度对齐到精度 2 并正确对齐
- 在 64 位边界上对齐C++结构数组?
- 使用 g++7 构建的代码在访问未对齐的内存时崩溃
- 在 capnp FlatArrayMessageReader 的对齐内存缓冲区中接收 zmq 消息
- 是否值得对齐变量?
- 初始化派生结构的基部分/意外打包派生结构字段以对齐基结构的间隙
- 对齐和对齐的实际用例C++关键字
- 如何减少代码的运行时间以对齐文本?
- 指向包含对齐 C 结构C++类的 C 指针的对齐问题
- Linux C++ 中的页面对齐内存分配
- C++ 类层次结构中的"对齐"是什么意思?
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 具有调整对齐方式的类型定义
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?