展开全部
文件流太麻烦了,它是需要先读入内存再进行操作。 不管是linux还是windows 都是基于虚拟内存技术的,在这种技术的情况下引入了一种叫做 内存文件映射的机制 就是将文件的内容直接映射到虚拟内存,或者说将文件当成虚拟内存交换文件。
注意看你的左侧地址 那是物理地址:它是0x474h,啥叫物理地址呢? 就是你用16进制打开一个文件后的物理偏移地址,它是从00开始的, 要映射到内存你需要转化成虚拟内存地址。公式= 基地址 + 物理地址
先说基地址:基地址就是文件被映射到内存的起始地址, 如下面的代码 就是一个将文件映射到内存的函数,它返回的地址就是文件的基地址。
对于windows来说 你只需要三步就可以了下面的代码是一个非常草率的例子,通过 CreateFile
CreateFileMapping()还有Mapviewoffile三个api来映射到内存。
LPVOID FileMap::MapFile(TCHAR* ptzFileName) {
TCHAR tzBuf[MAX_PATH] = {0};
m_hFile = CreateFile(ptzFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
if (m_hFile==INVALID_HANDLE_VALUE) {
//这里一会添加错误代码
GuiErrorPrint();
exit(1);
}
m_hMap = CreateFileMapping(m_hFile, 0, PAGE_READWRITE, 0, 0, 0);
if (m_hMap==0) {
PrintLastError(); CloseHandle(m_hFile); exit(1);
}
m_lpBase = MapViewOfFile(m_hMap, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
if (m_lpBase==0) {
PrintLastError(); CloseHandle(m_hMap); CloseHandle(m_hFile); exit(1);
}
return m_hFile;
}
函数返回的基地址 +0x474 就是对应的数据位置啦
我是菜鸟,希望能帮到你,观楼主英俊潇洒,风流倜傥,必当世豪杰,诚邀加入0x30百度贴吧,共商义举,建不世之功!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询