将二进制数据转换为C程序的十六进制数据

时间:2011-04-15 16:42:09

标签: c language-agnostic binary hex

我有一个小的二进制图像,需要在C程序中表示。表示将如下:

static const char[] = {0x1, 0x2, 0x3, 0x4...};

(因此,字节将表示为一系列字符)

如何将二进制文件转换为漂亮的0x ..,0x .. string?有没有这样做的程序?

8 个答案:

答案 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;
            }
    }

    ....
}