C++语言文件流问题

如何过滤一个文件流,然后让文件指针指向E0 7F 10 00 这个HEX值后,谢谢
2025-06-27 17:16:42
推荐回答(1个)
回答1:

文件流太麻烦了,它是需要先读入内存再进行操作。 不管是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百度贴吧,共商义举,建不世之功!