我有一个小的二进制图像,需要在C程序中表示。表示将如下:
static const char[] = {0x1, 0x2, 0x3, 0x4...};
(因此,字节将表示为一系列字符)
如何将二进制文件转换为漂亮的0x ..,0x .. string?有没有这样做的程序?
答案 0 :(得分:2)
使用xxd实用程序:
$ xxd -i binary.bin > binary.c
将使用以下内容创建binary.c
:
unsigned char binary_bin[] = {
0x01, 0x02, 0x03, 0x04, . . .
. . .
};
unsigned int binary_bin_len = 123456;
答案 1 :(得分:1)
在Python 2.6中
from __future__ import with_statement
with open('myfile.bin') as f:
s = f.read()
for c in s:
print hex(ord(c)) + ",",
答案 2 :(得分:1)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LENGTH 80
int main(void)
{
FILE *fout = fopen("out.txt", "w");
if(ferror(fout))
{
fprintf(stderr, "Error opening output file");
return 1;
}
char init_line[] = {"char hex_array[] = { "};
const int offset_length = strlen(init_line);
char offset_spc[offset_length];
unsigned char buff[1024];
char curr_out[64];
int count, i;
int line_length = 0;
memset((void*)offset_spc, (char)32, sizeof(char) * offset_length - 1);
offset_spc[offset_length - 1] = '\0';
fprintf(fout, "%s", init_line);
while(!feof(stdin))
{
count = fread(buff, sizeof(char), sizeof(buff) / sizeof(char), stdin);
for(i = 0; i < count; i++)
{
line_length += sprintf(curr_out, "%#x, ", buff[i]);
fprintf(fout, "%s", curr_out);
if(line_length >= MAX_LENGTH - offset_length)
{
fprintf(fout, "\n%s", offset_spc);
line_length = 0;
}
}
}
fseek(fout, -2, SEEK_CUR);
fprintf(fout, " };");
fclose(fout);
return EXIT_SUCCESS;
}
在这里,更新,有效。管道在文件中,它将其作为十六进制的unsigned char数组吐出到out.txt。
另一个编辑:想想我也可以做得很好。将它打印到out.txt,一个unsigned char数组,格式很好。如果你想要添加任何东西,应该从这里微不足道
答案 3 :(得分:1)
如果pBuff
是您的二进制数据,请尝试计算缓冲区的长度,例如:
lenBuffer= sizeof(..);
for (i = 0; i < lenBuffer; i++)
printf("%x ", pBuff[i]);
答案 4 :(得分:0)
你可以编写一个程序来轻松地完成它,但这里有一个perl script可以帮你完成。
答案 5 :(得分:0)
答案 6 :(得分:0)
答案 7 :(得分:0)
效果很好!但是我进行了一些小改动,允许在命令行中指定输入和输出文件:
int main(int argc, char **argv)
{
FILE *fout = NULL;
FILE *fin = NULL;
const char *optstring = "i:o";
char ch;
int argind = 1;
if(argc < 5)
{
fprintf(stderr,"Usage: bin2array -i <input_file> -o <output_file>\n");
return 2;
}
while((ch = getopt(argc,argv,optstring)) != -1)
{
switch(ch)
{
case 'i':
argind++;
fprintf(stderr,"File: %s\n",argv[argind]);
fin = fopen(argv[argind],"rb");
argind++;
break;
case 'o':
argind++;
fprintf(stderr,"File: %s\n",argv[argind]);
fout = fopen(argv[argind],"wt");
argind++;
break;
}
}
....
}