【问题标题】:How to get the bytes of a file?如何获取文件的字节数?
【发布时间】:2012-08-13 13:46:26
【问题描述】:

我知道的简单问题,我想要做的是能够获取文件的字节以用于将这些字节添加到位数组中,然后我可以使用它来写入名为 bytes.exe 的文件并启动它。我知道如何在运行时读取现有文件的字节。但我不知道如何在设计时将文件的字节复制并粘贴到我的bitarray[] 中。

目标是能够在运行时将bitarray[] 的片段写入myfile.exe,然后启动所述文件。我将根据许多不同的文件类型使用许多bitarray[]'s,因此我正在寻找一种简单的方法。

是否应该使用某种反编译器?我只是查看了资源脚本,但我不想将任何依赖项附加到我的主 .exe。

【问题讨论】:

  • 显式复制文件有什么问题?您尝试手动移动字节是否有原因?
  • 您的意思是在设计时复制文件?我该怎么做?
  • “设计时间”是什么意思?
  • 在我写代码的时候。编译前。

标签: c++ c bitarray


【解决方案1】:

如果您的目标是 Windows,最简单的方法是将 myfile.exe 作为资源嵌入,然后在运行时加载资源并创建文件并将资源的内容写入新文件。

如果您不能使用资源,那么您需要创建一个源文件(.c 或 .h),该文件使用 myfile.exe 的内容初始化一个字节数组,并将其包含在您的构建中。查看此答案以了解一种可能的方法:

https://stackoverflow.com/a/73653/333127

编辑:经过进一步审查,我认为我上面引用的链接中的源代码不适用于二进制输入文件。这是我刚刚汇总的一个快速替代方案:

#include <stdio.h>
#include <stdlib.h>

#define BYTES_PER_LINE 70

int main(int argc, char* argv[])
{
    FILE* fp;
    int ch;
    int numBytes = 0;

    if (argc < 2) {
        printf("Usage: tobytes <file>\n");
        exit(1);
    }

    fp = fopen(argv[1], "rb");
    if (fp == NULL) {
        printf("Cannot open file %s\n", argv[1]);
        exit(1);
    }

    printf("char fileContents[] = {\n");
    while ((ch = fgetc(fp)) != EOF) {
        if (numBytes > 0)
            printf(",");

        ++numBytes;
        if (numBytes % BYTES_PER_LINE == 0)
            printf("\n");

        printf("0x%x", ch);
    }
    printf("\n};\n");

    fclose(fp);

    return 0;
}

【讨论】:

  • 不错的一个。我只是虽然已经有一个程序可以做到这一点。如果还没有,我想我会发布我的。
  • 我可以使用源代码发布我的新程序 ExeEmbedder © 吗? (开玩笑 50%)
  • 如果你安装了vim,你可以运行xxd -i thefile来做同样的事情
  • @nos:直到现在我才知道xxd——感谢您的提醒。
  • @cbranch,感谢您提供的代码。看起来不错,如果我有任何问题会告诉你。
【解决方案2】:

不是 100% 清楚你想做什么,但为什么不写一个小程序来读取文件并将其转换为 C 数组。

即如果文件数据是:

01 02 03 04 (binary)

程序会生成一个文件:

char data[] = {0x01, 0x02, 0x03, 0x04};

然后将此程序作为应用程序的预构建步骤运行(在您的 Makefile 或您正在使用的任何构建系统中),并将输出生成到您的源代码树中。

通过这种方式,数据将被编译到您的应用程序中并静态可用。

正如我所说,我不清楚这是否是您要解决的问题。

【讨论】:

  • 是的,亲爱的。我考虑过这种方法,但我只是认为我可能已经完成了。我试图用谷歌搜索一个可以做到这一点的程序,但没有运气。这让我很惊讶,因为我认为这会比较普遍。
  • 这种东西一般称为“资源”和“资源编译器”,通过各种机制将数据文件捆绑到应用程序中。每个平台的做法都不一样。我描述的是功能最少的最简单的方法。
  • 谢谢,我会用谷歌搜索这些关键字。我只需要获取程序“abc.exe”的字节并将其作为字节数组放入 myprog.exe,然后在运行时将程序作为 newprog.exe 写入新的字节数组。
  • 哦,我知道这听起来像是我在试图窃取知识产权,但事实并非如此:D
猜你喜欢
  • 2013-11-23
  • 2013-10-14
  • 2019-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-13
  • 2021-05-03
  • 2017-09-18
相关资源
最近更新 更多