理解OVERLAPPED结构体偏移字段:OffsetHigh设为1时的作用是什么?
OVERLAPPED结构OffsetHigh字段取值效果说明
OVERLAPPED 结构的 Offset 和 OffsetHigh 是成对使用的字段,二者共同组成一个64位无符号整数,作为ReadFile/WriteFile异步读写操作的文件起始偏移量,计算逻辑为:
实际读取起始偏移(字节) = (OffsetHigh << 32) | Offset
你之前设置 Offset = 8、OffsetHigh = 0 时,实际偏移就是 0*2^32 + 8 = 8,符合从第8字节开始读取的需求。如果保持Offset=8不变,仅将OffsetHigh设为1,实际读取起始偏移会变为 1*2^32 + 8 = 4294967304 字节,即会从文件的4GB+8字节的位置开始读取数据。
额外补充注意点:
- 该偏移计算规则仅适用于支持随机访问的句柄(如普通磁盘文件、磁盘卷、物理磁盘句柄等),如果是面向流的不支持随机访问的句柄(如匿名管道、命名管道、套接字),调用
ReadFile传入OVERLAPPED结构时必须将Offset和OffsetHigh都设为0,否则调用会失败。 OffsetHigh字段的设计初衷是支持4GB以上大文件的随机访问:32位的Offset字段最大只能表示到2^32 - 1即4GB的偏移,超过4GB的偏移就需要通过修改OffsetHigh来覆盖高32位的地址范围。
内容的提问来源于stack exchange,提问作者James Franco
相关产品推荐
相关产品推荐

