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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 63, средняя оценка - 4.78
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
#1

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

12.10.2011, 23:57. Просмотров 8807. Ответов 11
Метки нет (Все метки)

Как открыть файл в 16ричном виде? Насколько я понял это средствами только с++ невозможно ... или всё же возможно? Вообще хотелось бы написать небольшую программку которая будет сохранять из файла с hex кодом небольшие кусочки (отрезки кода) и сохранять их в виде файлов. Но допустим так то с файлами я умею работать (в плане открытия в виде текстового/бинарного и сохранения файлов), а вот как открыть файл в режиме hex?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2011, 23:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чтение файла как hex (C++):

Чтение файла и запись в HEX - C++
Доброго времени суток. Надеюсь на Вашу помощь, ибо у самого мозгов уже хватает. Имеем задачу: открыть файл lesson.txt, указанный в...

Чтение файла GIF. Перевод текста в HEX. Декодирование GIF анимации - C++
Всем привет.. задача такая: Необходимо открыть файл GIF.. Например, как в этой статье про декодирование.. ...

Если HEX одного файла заменить на HEX другого, то изменится ли файл и будет ли работоспособным? - C++
Привет, если два файла a.exe(калькулятор) и b.exe(выводит строку "Hello World") Если открыть файл b.exe в HEX-редакторе и подменить его...

Std::count << std::hex << (long) 0x0a; Как сделать, чтоб от HEX значения ноль при выводе не убирался? - C++
сабж...( std::count &lt;&lt; std::hex &lt;&lt; (long) 0x0a; ) выводится просто a, вместо 0а, а надо чтоб было именно 0а... куда делся setw,...

Как разбить одно число HEX число на два числа HEX ? - C++
Задача в том, что бы одно число в виде HEX (к примеру 0xD681) разбить на 2 числа HEX (из 0xD681 - &gt; 0xD6 и 0x81) именно что бы вот так...

как может корректно выполняющийся оператор >> (чтение из текстового файла) негативно влиять на открытие другого файла? - C++
Друзья! Создадим два текстовых файла, f_0.txt и f_1.txt и что-нибудь в них запизаем, например в первый запихаем 1234 а во второй 5678 и...

11
kazak
3035 / 2356 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
12.10.2011, 23:59 #2
Читать бинарный файл, выводить коды символов в hex-виде.
1
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
13.10.2011, 10:06  [ТС] #3
kazak, а можно пример или ссылку на что подобное чтобы выводились символы в 16ричном виде?
0
Nameless One
Эксперт С++
5774 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
13.10.2011, 10:57 #4
Gepar,
C
1
2
unsigned char c = /* bla-bla-bla */;
printf("%x", (size_t) c);
1
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
13.10.2011, 11:04 #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
1
Nameless One
Эксперт С++
5774 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
13.10.2011, 11:19 #6
В С++, соответственно, используем манипулятор std::hex
0
kravam
быдлокодер
1696 / 883 / 45
Регистрация: 04.06.2008
Сообщений: 5,474
13.10.2011, 11:19 #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;
}
0
kazak
3035 / 2356 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
13.10.2011, 11:53 #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;
}
0
kravam
быдлокодер
1696 / 883 / 45
Регистрация: 04.06.2008
Сообщений: 5,474
13.10.2011, 12:49 #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);
   }
и будет круто
0
kazak
3035 / 2356 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
13.10.2011, 13:18 #10
Цитата Сообщение от kravam Посмотреть сообщение
kazak, корявенько выглядит
C++
1
static_cast<int>(sym)
заменить на
C++
1
static_cast<int>(sym & 0xff)
и будет ровненько.
0
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
13.10.2011, 17:02  [ТС] #11
Вообще друг чего попросил:
Код
можешь ли ты написать на с++ прожку, которая выдирает из файла с 16чный кодом куски с указанными адресами (отрезки кода) и сохраняет каждый из них в отдельный бин-файл?
В общем под вечер посмотрю Ваши примеры и попробую разобраться, хотя я пока что не совсем понимаю как брать отрезки кода ориентируясь по указанным адресам.
0
kazak
3035 / 2356 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
13.10.2011, 23:54 #12
Если адрес начала и конца блока известны, то устанавливаешь указатель в файле на позицию соответствующую началу блока, и считываешь в буфер количество байт равное разности конечного и начального адреса. Буфер потом сохраняешь в отдельный файл.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2011, 23:54
Привет! Вот еще темы с ответами:

Как сделать чтение из файла? - C++
Суть задания в том, что надо найти повторяющие буквы в словах, вот у меня есть код который делает это из строковой переменной, а как...

как сделать чтение из файла - C++
алгоритм дейкстры, нужно чтобы пользователь не забивал количество вершин, веса, и количество ребер, а программа читала это все с файла TXT...

Открытие файла в режиме HEX - C++
Здравствуйте, подскажите пожалуйста способы открытия файла, так чтоб записать допустим в TStringList HEX код файла и желательно, чтоб...

Подскажите как прекратить чтение из файла? - C++
Есть программа: #include&lt;iostream&gt; #include&lt;fstream&gt; using namespace std; int main() { ifstream cin(&quot;in.txt&quot;); int name; ...


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

Или воспользуйтесь поиском по форуму:
12
Yandex
Объявления
13.10.2011, 23:54
Ответ Создать тему
Опции темы

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