fmemopen正在更改映射文件Structure

时间:2013-07-15 18:17:19

标签: c

我正在尝试使用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。

任何建议都会受到赞赏。谢谢

2 个答案:

答案 0 :(得分:4)

重新阅读您的代码,我还有一些观察结果:

  1. 很明显,您没有将正确的参数传递给fwrite。第一个参数是指向内存缓冲区的指针,而不是另一个FILE*。在这种情况下,您将奇怪的内存复制到新的可执行文件中,这就是无法执行的原因。

    如果您有一块内存要复制到可执行文件,只需fwrite该内存块:

    FILE* fp_out = fopen("testing.exe", "wb");
    /* ... */
    fwrite(value, sizeof(value), 1, fp_out);
    

    但是,这假定value是一个适合执行的完整且完整的可执行映像(您可能需要chmod +x testing.exe)。如果这个二进制映像甚至包含适用于您平台的有效可执行文件,我会想知道.exe的扩展名。

  2. 在处理假定的可执行映像时,您不希望使用strlen,即使它已“存储”在char*中。可执行文件包含字节值0,它是C字符串分隔符字符NUL(例如'\0')。这会导致strlen失误。您需要使用sizeof或跟踪可执行映像的大小。

  3. 如果您在致电"wb"时努力使用fopen,最好在"rb"的通话中使用fmemopen。这样,您就不会在执行此操作的系统上收到换行符(Windows)。如果您使用的平台不符合此要求,请从通话中删除b或保留它。无论你选择什么,都要保持一致。

答案 1 :(得分:1)

由于您说fmemopen改变了文件的方式,请注意您选择“rb”作为模式。哪个代表读取为二进制。尝试只使用“r”。

编辑[谢谢Scott] 由于您正在写一个可执行文件,因此您将保留“rb”,然后您必须使用“wb”进行编写。