преобразовать двоичные данные в шестнадцатеричную строку для программы на C - PullRequest
2 голосов
/ 15 апреля 2011

У меня есть небольшое двоичное изображение, которое должно быть представлено в программе на Си.Представление будет выглядеть так:

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

(поэтому байты будут представлены в виде последовательности символов)

Как преобразовать двоичный файл в хороший 0x .., 0x.. строка?Есть ли программа для этого?

Ответы [ 8 ]

2 голосов
/ 02 апреля 2018

Используйте утилиту xxd :

$ xxd -i binary.bin > binary.c

Создает binary.c со следующим содержанием:

unsigned char binary_bin[] = {
  0x01, 0x02, 0x03, 0x04,   . . .
  . . .
};
unsigned int binary_bin_len = 123456;
1 голос
/ 15 апреля 2011
#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;
}

Вот, обновился, работает.Передавайте файл в файл, он выводит его в виде массива char без знака в шестнадцатеричном формате для out.txt.

Другое редактирование: подумал, что я также могу сделать это хорошо.Распечатывает его в out.txt, массив без знака и красиво отформатированный.Отсюда должно быть тривиально, если вы хотите что-то добавить к нему

1 голос
/ 24 мая 2013

Если pBuff - ваши двоичные данные, попробуйте определить длину вашего буфера, например,

lenBuffer= sizeof(..);
for (i = 0; i < lenBuffer; i++)
  printf("%x ", pBuff[i]);
1 голос
/ 15 апреля 2011

В 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)) + ",",
0 голосов
/ 29 июня 2011

Отлично работает!Однако я внес небольшое изменение, чтобы разрешить указание входных и выходных файлов в командной строке:

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

    ....
}
0 голосов
/ 16 мая 2011

Приложение с открытым исходным кодом Hexy разработано специально для этого.Работает на Windows и Linux.

0 голосов
/ 15 апреля 2011
0 голосов
/ 15 апреля 2011

Вы можете написать программу, чтобы сделать это довольно легко, но вот скрипт perl , который может сделать это за вас.

...