C++ 将二进制文件(exe、zip等)读入char*、c++;

C++ 将二进制文件(exe、zip等)读入char*、c++;,c++,file,C++,File,我试图读取文件并将字节放入字节缓冲区,但当我尝试读取exe或zip文件时,并非所有字节都加载到缓冲区。我的职能: char* read_file_bytes(const string &name) { FILE *img = fopen(name.c_str(), "rb"); fseek(img, 0, SEEK_END); unsigned long filesize = ftell(img); char *buffer = (char*)malloc(siz

我试图读取文件并将字节放入字节缓冲区,但当我尝试读取exe或zip文件时,并非所有字节都加载到缓冲区。我的职能:

char* read_file_bytes(const string &name) {
   FILE *img = fopen(name.c_str(), "rb");
   fseek(img, 0, SEEK_END);
   unsigned long filesize = ftell(img);
   char *buffer = (char*)malloc(sizeof(char)*filesize);
   rewind(img);
   fread(buffer, sizeof(char), filesize, img);
   return buffer;
}
检查缓冲区的代码段:

char* bytes = read_file_bytes(path);
for(int i = 0; i < strlen(bytes); i++)
    cout << hex << (unsigned int)(bytes[i]);
char*bytes=读取文件字节(路径);
for(int i=0;istrlen()
设计用于文本字符,而不是二进制字节。当遇到nul
char
(0x00)时,它停止计数,二进制数据可能包含该字符

您的
read\u file\u bytes()
函数知道它读取了多少字节。您需要将该号码返回给来电者,例如:

typedef无符号字符字节;
字节*读取文件字节(常量std::string和name、无符号long和filesize)
{
filesize=0;
文件*img=fopen(name.c_str(),“rb”);
如果(!img)
返回NULL;
如果(fseek(img,0,SEEK_END)!=0)
{
fclose(img);
返回NULL;
}
长尺寸=ftell(img);
如果(尺寸==-1L)
{
fclose(img);
返回NULL;
}
字节*buffer=static_cast(std::malloc(size));
如果(!缓冲区)
{
fclose(img);
返回NULL;
}
倒带(img);
if(fread(缓冲区,1,大小,img)
无符号长文件大小;
字节*字节=读取文件字节(路径、文件大小);
for(无符号长i=0;i你怎么知道不是所有的字节都被加载了?调用代码怎么知道缓冲区有多大?而且,根据您的平台,
fseek(img,0,SEEK\u END)
:“将文件位置指示器设置为文件末尾,与
fseek(file,0,SEEK\u END)
一样,对于二进制流有未定义的行为……”“二进制流不需要有意义地支持
fseek
调用,其值为
SEEK\u END
”无论是谁教你使用
fseek()
/
ftell()
来获取文件的大小,都可能忽略了这一点……但是什么导致代码在4字节后停止?请编辑您的问题以包含检查返回缓冲区的代码。
strlen()
在看到零字节时停止。不是您想要用于二进制数据的内容。当您不使用字符串时,为什么要使用
strlen()