我需要一个脚本/工具,它读取二进制文件并输出一个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)
如果您在类似 *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)
一个简单的工具,可以发现这里:
#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)