用于将文件转换为C/C++源代码数组的脚本/工具

Alb*_*ert 72 c binary

我需要一个脚本/工具,它读取二进制文件并输出一个C/C++源代码数组(代表文件内容).有吗?


(这个问题早些时候被删除了.我把这个问题放回去了,因为它很有价值.我在谷歌上搜索的确没有找到任何东西.当然,编写自己的代码是微不足道的,但如果我能节省一些时间会发现这么简单的剧本.因此它很有价值.

这个问题也有很多下注而没有太多解释.请在你投票之前发表评论,为什么你认为这没有价值或价值不好.

这个问题也引起了很多关于我所问的问题的困惑.如果不清楚,请询问.我真的不知道如何更清楚.请参阅答案以获取示例.

另外(在这里提出问题之后),我已经有了几个答案.我只是想在这里(再次)把它们链接起来,因为我认为对于其他搜索它的人来说这可能是有用的.)

Mat*_*lia 123

在Debian和其他Linux发行版上默认安装(连同vim)该xxd工具,在给定-i选项的情况下,它可以执行您想要的操作:

matteo@teodeb:~/Desktop$ echo Hello World\! > temp
matteo@teodeb:~/Desktop$ xxd -i temp 
unsigned char temp[] = {
  0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x21,
  0x0a
};
unsigned int temp_len = 13;
Run Code Online (Sandbox Code Playgroud)

  • 很好!它甚至可以在MacOSX中使用. (6认同)
  • @MatteoItalia - 我同意.我把它包装好了,所以通过`|来输出输出 sed's/unsigned/const unsigned /'`,它可以在这一行中说出你需要的任何东西.(我把结果放到一个单独的文件中 - 很容易被覆盖). (3认同)
  • 将xxd集成到Windows上的Visual Studio 2013解决方案时没有遇到任何问题.我用[这个来源](http://www.opensource.apple.com/source/vim/vim-43/vim/src/xxd/xxd.c?txt) (2认同)
  • 唯一的问题可能是,这个数组不是const(以及长度).这可能会对微控制器(RAM与ROM)产生影响.您可能需要编辑生成的文件. (2认同)
  • @TomaszGandor:是的,虽然从我在例如 AVR 微控制器上看到的 `const` 是不够的,如果你想让它们留在闪存中,你必须添加供应商特定的属性(gcc 中的 `PROGMEM`);我担心这种情况对于通用工具来说可能过于具体,您可能需要编写特定的构建脚本。 (2认同)

ast*_*ums 8

如果您在类似 *nix 的系统上,使用 xxd 工具接受的答案很好。这是任何在路径上具有 python 可执行文件的系统的“单行”:

python -c "import sys;a=sys.argv;open(a[2],'wb').write(('const unsigned char '+a[3]+'[] = {'+','.join([hex(b) for b in open(a[1],'rb').read()])+'};').encode('utf-8'))" <binary file> <header file> <array name>
Run Code Online (Sandbox Code Playgroud)

<二进制文件>是你想转成C头文件的文件名,<头文件>是头文件名,<数组名>是你想让数组有的名字。

上面的一行 Python 命令与以下(更具可读性)Python 程序大致相同:

python -c "import sys;a=sys.argv;open(a[2],'wb').write(('const unsigned char '+a[3]+'[] = {'+','.join([hex(b) for b in open(a[1],'rb').read()])+'};').encode('utf-8'))" <binary file> <header file> <array name>
Run Code Online (Sandbox Code Playgroud)

  • 我使用这个答案而不是自己写。它缺少很多格式,并且 .h 文件可以使用一些 #ifdef 保护来防止多重包含,但它有效。工作+1。 (2认同)

Alb*_*ert 6

一个简单的工具,可以发现这里:

#include <stdio.h>
#include <assert.h>

int main(int argc, char** argv) {
    assert(argc == 2);
    char* fn = argv[1];
    FILE* f = fopen(fn, "rb");
    printf("char a[] = {\n");
    unsigned long n = 0;
    while(!feof(f)) {
        unsigned char c;
        if(fread(&c, 1, 1, f) == 0) break;
        printf("0x%.2X,", (int)c);
        ++n;
        if(n % 10 == 0) printf("\n");
    }
    fclose(f);
    printf("};\n");
}
Run Code Online (Sandbox Code Playgroud)