我正在尝试使用fmemopen函数将可执行文件的char *映射到内存中,该函数应返回FILE *以便能够使用它(根本不将其写入硬盘驱动器)。 fmemopen函数更改文件的问题,以便当我从FILE *写入文件时,它具有无法识别的不同格式。
FILE * stream;
stream = fmemopen(value, strlen(value), "rb"); FILE *fp;
fp = fopen("testing.exe", "w");
fwrite(stream, leng, 1, fp);
其中value是a(char *),leng是char * length。
任何建议都会受到赞赏。谢谢
答案 0 :(得分:4)
重新阅读您的代码,我还有一些观察结果:
很明显,您没有将正确的参数传递给fwrite
。第一个参数是指向内存缓冲区的指针,而不是另一个FILE*
。在这种情况下,您将奇怪的内存复制到新的可执行文件中,这就是无法执行的原因。
如果您有一块内存要复制到可执行文件,只需fwrite
该内存块:
FILE* fp_out = fopen("testing.exe", "wb");
/* ... */
fwrite(value, sizeof(value), 1, fp_out);
但是,这假定value
是一个适合执行的完整且完整的可执行映像(您可能需要chmod +x testing.exe
)。如果这个二进制映像甚至包含适用于您平台的有效可执行文件,我会想知道.exe
的扩展名。
在处理假定的可执行映像时,您不希望使用strlen
,即使它已“存储”在char*
中。可执行文件包含字节值0,它是C字符串分隔符字符NUL(例如'\0'
)。这会导致strlen
失误。您需要使用sizeof
或跟踪可执行映像的大小。
如果您在致电"wb"
时努力使用fopen
,最好在"rb"
的通话中使用fmemopen
。这样,您就不会在执行此操作的系统上收到换行符(Windows)。如果您使用的平台不符合此要求,请从通话中删除b
或保留它。无论你选择什么,都要保持一致。
答案 1 :(得分:1)
由于您说fmemopen改变了文件的方式,请注意您选择“rb”作为模式。哪个代表读取为二进制。尝试只使用“r”。
编辑[谢谢Scott] 由于您正在写一个可执行文件,因此您将保留“rb”,然后您必须使用“wb”进行编写。