我写了一个二进制解析器,可以读取和打印文件的各种信息。出于速度的原因,我希望直接使用E32ImageHeader数据,而不是函数调用。
我传递nullptr初始化变量,在函数返回后,变量保持为nullptr。在GetFileLayout()中,gdb打印iHdr的各种字段值,其中一些需要修改。
代码看起来是正确的,但工具打印"Header not recognized!“,用于测试kf__speedups_SDK.pyd take here的二进制文件
main.cpp:
#include <iostream>
#include "e32info.h"
#include "e32parser.h"
using namespace std;
int main()
{
E32ImageHeader *hdr = nullptr;
E32Parser *parser = new E32Parser("AlternateReaderRecogE32.dll", hdr);
parser->GetFileLayout(hdr);
if(!hdr)
cout << "Header not recognized!!!\n";
// E32Info *f = new E32Info("h", "AlternateReaderRecogE32.dll");
// f->Run();
cout << "Hello world!" << endl;
delete parser;
return 0;
}
二进制解析器头文件e32parser.h:
#ifndef E32PRODUCER_H
#define E32PRODUCER_H
class E32ImageHeader;
class E32Parser
{
public:
E32Parser(const char* aFilename, E32ImageHeader *aHdr);
~E32Parser();
void GetFileLayout(E32ImageHeader *result);
private:
void ReadFile();
private:
E32ImageHeader *iHdr = nullptr;
const char *iFileName = nullptr;
char *iBufferedFile = nullptr;
size_t iE32Lenth = 0;
}
它的工作原理e32parser.cpp:
#include <fstream>
#include <cstring>
#include <cstdlib>
#include "e32common.h"
#include "e32parser.h"
E32Parser::E32Parser(const char* aFilename, E32ImageHeader *aHdr):
iHdr(aHdr), iFileName(aFilename)
{
}
E32Parser::~E32Parser()
{
delete iBufferedFile;
}
将二进制文件读取到内部缓冲区
void E32Parser::ReadFile()
{
std::fstream fs(iFileName, fs.binary | fs.in);
if(!fs)
throw;
fs.seekg(0, fs.end);
int lenth = fs.tellg();
fs.seekg(0, fs.beg);
iBufferedFile = new char[lenth];
fs.read(iBufferedFile, lenth);
fs.close();;
}
void E32Parser::GetFileLayout(E32ImageHeader *result)
{
ReadFile();
iHdr = (E32ImageHeader*)iBufferedFile;
result = (E32ImageHeader*)iBufferedFile;
}
发布于 2018-09-05 07:21:57
正如注释中所指出的,您的问题是您正在修改传入的指针的副本。考虑这个小示例:
void modify(int* p) { p = new int{10}; }
int main()
{
int* n = nullptr;
modify(n);
if (n)
std::cout << *n;
}
此程序的输出为nothing (并且它会泄漏内存)。modify
不会改变原始值,它会改变n
的副本。解决这个问题的方法,以及你的程序,是通过引用传递指针。
void modify(int*& p) { p = new int{10}; }
和
void E32Parser::GetFileLayout(E32ImageHeader*& result)
然而,我认为更好的修复方法是返回指针,以防止此问题:
E32ImageHeader* E32Parser::GetFileLayout()
{
...
iHdr = (E32ImageHeader*)iBufferedFile;
return iHdr;
}
但是由于iHdr
是传递给E32Parser
的,所以您可以将其更改为引用
https://stackoverflow.com/questions/52174723
复制相似问题