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

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

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

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

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

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

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

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

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

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

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

Чтение файла, как прочитать пробел? - C++
Вопрос в том как прочитать пробел в файле? Пробовал условием else if но видимо cin как то не так с этим работает. На консоль все без...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kazak
3033 / 2354 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
12.10.2011, 23:59     Чтение файла как hex #2
Читать бинарный файл, выводить коды символов в hex-виде.
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
13.10.2011, 10:06  [ТС]     Чтение файла как hex #3
kazak, а можно пример или ссылку на что подобное чтобы выводились символы в 16ричном виде?
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
13.10.2011, 10:57     Чтение файла как hex #4
Gepar,
C
1
2
unsigned char c = /* bla-bla-bla */;
printf("%x", (size_t) c);
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
13.10.2011, 11:19     Чтение файла как hex #6
В С++, соответственно, используем манипулятор std::hex
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,412
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
3033 / 2354 / 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
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,412
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
3033 / 2354 / 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
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
13.10.2011, 17:02  [ТС]     Чтение файла как hex #11
Вообще друг чего попросил:
Код
можешь ли ты написать на с++ прожку, которая выдирает из файла с 16чный кодом куски с указанными адресами (отрезки кода) и сохраняет каждый из них в отдельный бин-файл?
В общем под вечер посмотрю Ваши примеры и попробую разобраться, хотя я пока что не совсем понимаю как брать отрезки кода ориентируясь по указанным адресам.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2011, 23:54     Чтение файла как hex
Еще ссылки по теме:

Создание .exe файла из hex кода - C++
Здравствуйте, имеется код: unsigned char HexVar = {0x83, 0xEC, 0x20, 0x4C, 0x8B, 0xE9, 0x49, 0x8B, 0xC8, 0x49, 0x8B, 0xE9, 0x49, 0x8B,...

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

Как правильно реализовать чтение данных из текстового файла? - C++
char buff; ifstream sho; sho.open(&quot;Мафіни.txt&quot;); if (!sho.is_open()) { cout &lt;&lt; &quot;Error!!!\n&quot;; } else { cout &lt;&lt;...

Запись структуры и чтение из файла в структуру ( как бы лучше ) - C++
Подкиньте идею как лучше записать структуру в файл и обратно из файла в структуру У меня есть мысль: даны 4 элемента вводим их в...

Записать hex( шестнадцатеричная система счисления ) код файла в блокнот - C++
Здравствуйте, как записать hex код файла в блокнот ? Добавлено через 24 минуты проблема решена.


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

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

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