C++语言文件流问题

如何过滤一个文件流,然后让文件指针指向E07F1000这个HEX值后,谢谢... 如何过滤一个文件流,然后让文件指针指向E0 7F 10 00 这个HEX值后,谢谢 展开
 我来答
吉祥二进制
高粉答主

2013-07-09 · 科技改变生活,生活改变科技。
吉祥二进制
采纳数:33926 获赞数:84579

向TA提问 私信TA
展开全部

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

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式