Форум программистов, компьютерный форум CyberForum.ru

Чтение файла как hex - C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 63, средняя оценка - 4.78
Gepar
 Аватар для Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
12.10.2011, 23:57     Чтение файла как hex #1
Как открыть файл в 16ричном виде? Насколько я понял это средствами только с++ невозможно ... или всё же возможно? Вообще хотелось бы написать небольшую программку которая будет сохранять из файла с hex кодом небольшие кусочки (отрезки кода) и сохранять их в виде файлов. Но допустим так то с файлами я умею работать (в плане открытия в виде текстового/бинарного и сохранения файлов), а вот как открыть файл в режиме hex?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2011, 23:57     Чтение файла как hex
Посмотрите здесь:

C++ как может корректно выполняющийся оператор >> (чтение из текстового файла) негативно влиять на открытие другого файла?
как сделать чтение из файла C++
Подскажите как прекратить чтение из файла? C++
Std::count << std::hex << (long) 0x0a; Как сделать, чтоб от HEX значения ноль при выводе не убирался? C++
Если HEX одного файла заменить на HEX другого, то изменится ли файл и будет ли работоспособным? C++
C++ Чтение файла GIF. Перевод текста в HEX. Декодирование GIF анимации
C++ Создание .exe файла из hex кода
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
12.10.2011, 23:59     Чтение файла как hex #2
Читать бинарный файл, выводить коды символов в hex-виде.
Gepar
 Аватар для Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
13.10.2011, 10:06  [ТС]     Чтение файла как hex #3
kazak, а можно пример или ссылку на что подобное чтобы выводились символы в 16ричном виде?
Nameless One
Эксперт С++
 Аватар для Nameless One
5759 / 3408 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
13.10.2011, 10:57     Чтение файла как hex #4
Gepar,
C
1
2
unsigned char c = /* bla-bla-bla */;
printf("%x", (size_t) c);
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
13.10.2011, 11:04     Чтение файла как hex #5
Gepar, код хреновый, писался очень быстро с целью дампать пакеты, как пример пойдет:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <stdio.h>
#include <string.h>
#include <stddef.h>
#include <ctype.h>
 
void dump(const unsigned char *buf, size_t len) {
    int i = 0;
    int lbix = 0;
    char lbuf[80] = { 0 };
 
    memset(lbuf, ' ', sizeof(lbuf));
    lbuf[sizeof(lbuf) - 1] = '\0';
 
    for (i = 0; i < len; ++i) {
        if ((i & 15) == 0) {
            if (lbix) {
                lbuf[53] = ' ';
                lbuf[54] = ' ';
                lbuf[55] = ' ';
                lbuf[73] = '\0';
                printf("%s\n", lbuf);
            }
 
            memset(lbuf, ' ', sizeof(lbuf));
            lbuf[sizeof(lbuf) - 1] = '\0';
 
            sprintf(lbuf, "%03x:", i);
            lbix = 4;
        }
        else if ((i & 7) == 0) {
            lbuf[lbix++] = ' ';
        }
 
        if (isprint(buf[i]))
            lbuf[56 + (i % 16)] = buf[i];
        else
            lbuf[56 + (i % 16)] = '.';
 
        sprintf(&lbuf[lbix], " %02x", buf[i]);
        lbix += 3;
        lbuf[lbix] = ' ';
    }
 
    lbuf[53] = ' ';
    lbuf[54] = ' ';
    lbuf[55] = ' ';
    lbuf[73] = '\0';
    printf("%s\n", lbuf);
}
 
int main() {
    size_t n = 0;
    unsigned char buf[BUFSIZ] = { 0 };
 
    while ((n = fread(buf, 1, BUFSIZ, stdin)) > 0)
        dump(buf, n);
 
    return 0;
}
temp - это моя программулька.
Код
fasked@nexus:~/Documents/src/temp/Debug$ ./temp < main.d
000: 6d 61 69 6e 2e 64 20 6d  61 69 6e 2e 6f 3a 20 2e   main.d main.o: . 
010: 2e 2f 6d 61 69 6e 2e 63  0a                        ./main.c.
Код
fasked@nexus:~/Documents/src/temp/Debug$ hexdump main.d
0000000 616d 6e69 642e 6d20 6961 2e6e 3a6f 2e20
0000010 2f2e 616d 6e69 632e 000a               
0000019
Nameless One
Эксперт С++
 Аватар для Nameless One
5759 / 3408 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
13.10.2011, 11:19     Чтение файла как hex #6
В С++, соответственно, используем манипулятор std::hex
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,302
13.10.2011, 11:19     Чтение файла как hex #7
Давно писал
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <stdlib.h>
#include <stdio.h>
int main () {
 
 //Это будет имя исходного файла
 char ima_faila [MAX_PATH];
 
 //Буферная переменная
 int bufer; 
 
 char prodolzhit_ili_net= 'y';
 
 int chotchik; 
 
 while (prodolzhit_ili_net== 'y' || prodolzhit_ili_net== 'Y') {
  chotchik= 0;
 
  printf ("Vvedi ima faila, kotorii ti hochesh peredelat\n");
  gets (ima_faila);
 
  FILE *f;
  FILE *f1;
 
  //ОБЯЗАТЕЛЬНО НАДО ДОБАВИТЬ "b"!
  f= fopen (ima_faila,"rb");  
 
  if (!f) {
   printf ("Ishodni file ne otkrit\n");
  }
 
  else {
 
   //Теперь откроем файл результат
   f1= fopen ("rez.txt","w");
   if (!f1) {
    printf ("File-rezultat ne sozdan\n");
   } 
 
   //Если он нормально открылся, то запишем в него теперь
   else {
    do {
     bufer= fgetc (f);
     if (bufer!=EOF) {
      fprintf (f1, "%-0.2x%c", bufer, ' ');
     }
     chotchik++;
     if (!(chotchik%16)) 
      fputc (10, f1);
//      printf ("eeeeeeee\n");  
    }
    while (bufer!= EOF);
    fseek (f1, 1, SEEK_CUR);
    fscanf (f1, "%x", &bufer);
    fclose (f1);
   }
 
  }
 
  //Разберёмся с закрытием файлов
  if (f) {
   fclose (f);
  }
 
  printf ("\nProdolzhit ? (Y ili y ili luboi drugoi znak)\n");
  scanf ("%c", &prodolzhit_ili_net);
  getchar ();
 
 }
 return 0;
}
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
13.10.2011, 11:53     Чтение файла как hex #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <fstream>
#include <iomanip>
 
using namespace std;
int main(int argc, char* argv[])
{
   if (argc < 2)
   {
      cout << "Use \"dump <file_name>\"" << endl;
      return 1;
   }
   ifstream fileIn (argv[1], ios::in|ios::binary);
   if (!fileIn.is_open())
   {
      cout << "Can not open file \"" << argv[1] << '\"' << endl;
      return 2;
   }
   char sym;
   int count = 0;
   while (1)
   {
      fileIn.read(&sym, 1);
      if (fileIn.eof())
         break;
      if (count % 16 == 0)
         cout << endl << "0x" << setw(7) << setfill('0') << hex << count / 16 << "0 ";
      if (count % 16 == 8)
         cout << ' ';
      cout << setw(2) << setfill('0')<< hex << static_cast<int>(sym) << ' ';
      count++;
   }
   return 0;
}
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,302
13.10.2011, 12:49     Чтение файла как hex #9
kazak, корявенько выглядит
0x00003900 6c 00 ffffffd4 07 00 00 01 00 20 00 02 00 00 00 00 00
0x00003910 ffffffcf 05 00 00 fffffff4 08 00 00 01 00 00 00 02 00 5f 66
0x00003920 63 6c 6f 73 65 00 4c 08 00 00 01 00 20 00 02 00
0x00003930 00 00 00 00 ffffffdd 05 00 00 00 01 00 00 06 00 00 00
0x00003940 02 00 00 00 00 00 ffffffec 05 00 00 00 00 00 00 ffffffff ffffffff
0x00003950 00 00 02 00 00 00 00 00 21 06 00 00 fffffff4 00 00 00
0x00003960 06 00 00 00 02 00 5f 66 73 65 65 6b 00 00 3c 08
0x00003970 00 00 01 00 20 00 02 00 00 00 00 00 2f 06 00 00
0x00003980 00 00 10 00 ffffffff ffffffff 00 00 02 00 00 00 00 00 48 06
0x00003990 00 00 00 10 00 00 06 00 00 00 02 00 00 00 00 00
0x000039a0 5a 06 00 00 00 00 40 00 ffffffff ffffffff 00 00 02 00 00 00
0x000039b0 00 00 67 06 00 00 03 00 00 00 ffffffff ffffffff 00 00 02 00
0x000039c0 00 00 00 00 75 06 00 00 00 00 00 00 00 00 20 00
0x000039d0 02 01 13 00 00 00 01 00 00 00 00 00 00 00 00 00
0x000039e0 00 00 00 00 00 00 00 00 ffffff8a 06 00 00 fffffffc 00 00 00
0x000039f0 06 00 00 00 02 00 00 00 00 00 ffffff97 06 00 00 ffffffcc 00
0x00003a00 00 00 06 00 00 00 02 00 00 00 00 00 ffffffac 06 00 00
0x00003a10 00 10 00 00 06 00 00 00 02 00 00 00 00 00 ffffffb9 06
0x00003a20 00 00 08 01 00 00 06 00 00 00 02 00 00 00 00 00
0x00003a30 ffffffc7 06 00 00 ffffffb4 00 00 00 06 00 00 00 02 00 00 00
0x00003a40 00 00 ffffffdc 06 00 00 48 00 00 00 05 00 00 00 02 00
0x00003a50 00 00 00 00 ffffffec 06 00 00 ffffffc0 00 00 00 06 00 00 00
0x00003a60 02 00 00 00 00 00 11 07 00 00 00 00 00 00 00 00
0x00003a70 20 00 02 01 12 00 00 00 01 00 00 00 00 00 00 00
0x00003a80 00 00 00 00 00 00 00 00 00 00 2a 07 00 00 01 00
0x00003a90 00 00 ffffffff ffffffff 00 00 02 00 00 00 00 00 42 07 00 00
0x00003aa0 00 00 00 00 ffffffff ffffffff 00 00 02 00 00 00 00 00 53 07
0x00003ab0 00 00 00 00 00 00 02 00 00 00 02 00 00 00 00 00
0x00003ac0 5e 07 00 00 ffffffe4 07 00 00 01 00 20 00 02 00 00 00
0x00003ad0 00 00 68 07 00 00 14 01 00 00 06 00 00 00 02 00
0x00003ae0 00 00 00 00 76 07 00 00 00 00 00 00 06 00 00 00
0x00003af0 02 00 00 00 00 00 ffffff8b 07 00 00 ffffffdc 00 00 00 06 00
0x00003b00 00 00 02 00 00 00 00 00 ffffff99 07 00 00 00 00 00 00
0x00003b10 ffffffff ffffffff 00 00 02 00 00 00 00 00 ffffffb5 07 00 00 00 00
0x00003b20 00 00 ffffffff ffffffff 00 00 02 00 00 00 00 00 ffffffcd 07 00 00
0x00003b30 ffffffe0 00 00 00 06 00 00 00 02 00 00 00 00 00 ffffffdc 07
0x00003b40 00 00 ffffffd8 00 00 00 06 00 00 00 02 00 5f 70 72 69
..............................................................................................................
Если нужен вывод в консоль, берём мой код, так меняем:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
   else {
    do {
     bufer= fgetc (f);
     if (bufer!=EOF) {
      fprintf (f1, "%-0.2x%c", bufer, ' ');
      //Если нужна консоль, добавляем это
      printf ("%-0.2x%c", bufer, ' ');
     }
     chotchik++;
     if (!(chotchik%16)) { 
      fputc (10, f1);
      //Если нужна консоль, добавляем это
      printf ("\n");
     }
    }
    while (bufer!= EOF);
    fseek (f1, 1, SEEK_CUR);
    fscanf (f1, "%x", &bufer);
    fclose (f1);
   }
и будет круто
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
13.10.2011, 13:18     Чтение файла как hex #10
Цитата Сообщение от kravam Посмотреть сообщение
kazak, корявенько выглядит
C++
1
static_cast<int>(sym)
заменить на
C++
1
static_cast<int>(sym & 0xff)
и будет ровненько.
Gepar
 Аватар для Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
13.10.2011, 17:02  [ТС]     Чтение файла как hex #11
Вообще друг чего попросил:
Код
можешь ли ты написать на с++ прожку, которая выдирает из файла с 16чный кодом куски с указанными адресами (отрезки кода) и сохраняет каждый из них в отдельный бин-файл?
В общем под вечер посмотрю Ваши примеры и попробую разобраться, хотя я пока что не совсем понимаю как брать отрезки кода ориентируясь по указанным адресам.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2011, 23:54     Чтение файла как hex
Еще ссылки по теме:

Открытие файла в режиме HEX C++
C++ Как разбить одно число HEX число на два числа HEX ?
Чтение файла и запись в HEX C++
Чтение файла, как прочитать пробел? C++
Как сделать чтение из файла? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
13.10.2011, 23:54     Чтение файла как hex #12
Если адрес начала и конца блока известны, то устанавливаешь указатель в файле на позицию соответствующую началу блока, и считываешь в буфер количество байт равное разности конечного и начального адреса. Буфер потом сохраняешь в отдельный файл.
Yandex
Объявления
13.10.2011, 23:54     Чтение файла как hex
Ответ Создать тему
Опции темы

Текущее время: 09:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru