我编写了二进制解析器,该解析器读取和打印有关文件的各种信息。我希望出于速度原因直接使用E32ImageHeader数据,而不要使用函数调用。
我传递了nullptr初始化变量,并且在函数返回变量之后仍然为nullptr。在GetFileLayout()中,gdb打印iHdr的各种字段值以及其他一些需要修改的字段。
代码看起来正确,但工具会显示“无法识别标题!”,测试kf__speedups_SDK.pyd的二进制文件为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;
}
答案 0 :(得分:0)
注释中指出,您的问题是您正在修改传入的指针的COPY。请考虑以下小示例:
void modify(int* p) { p = new int{10}; }
int main()
{
int* n = nullptr;
modify(n);
if (n)
std::cout << *n;
}
该程序的输出为空(并且会泄漏内存)。 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
,因此您可以将其更改为引用