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

Как побайтно считать информацию из исполняемого файла - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ почему выдает ошибку: ctrcmp? http://www.cyberforum.ru/cpp-beginners/thread703794.html
# include<iostream> # include<conio.h> # include<string> # include<stdio.h> #include <stdlib.h> using namespace std; struct mas { char name;
C++ Как нарисовать окружность Подскажите, пожалуйста, как нарисовать окружность в Microsoft Visual C++ .:thank_you: http://www.cyberforum.ru/cpp-beginners/thread703785.html
конкатенация char C++
Привет!!! Пытаюсь разобраться с указателями char ничего не получается. вот код: #include <iostream> using std::cout; using std::endl; #include <cstring> //prototip dl9 strcmp i strncmp using std::strcat;//konkatenasi9 strok
Двомерные масивы C++
Помогите что не так case 3:{long double b; int z; cout<<"Введите елементы масива"<<endl; for(int i=0;i<m;i++) for(int j=0;j<n;j++) {cin>>b; }
C++ ошибка при создании rc.exe http://www.cyberforum.ru/cpp-beginners/thread703764.html
#include <stdio.h> #include <stdlib.h> #include <time.h> void genKeyFile(char *fileName) { srand(time(0)); char key = rand()%254+1; FILE *fkey = fopen(fileName, "w"); fputc(key,fkey);
C++ Объясните пожалуйста, как конкретно работает код Программа считывает из файла фамилии, имена, годы рождения и балы студентов, и записывает в другой файл фамилии, начинающейся с букв А и Б и имеющие рейтинг больше 90. Я пишу как понимаю в комментаририях, прошу объяснить каждую строку, что не закоментировал или исправить, что понял не так. Очень хочу разобраться. #include "stdafx.h" // библиотека visual studio #include <fstream> //... подробнее

Показать сообщение отдельно
bychevoz
1 / 1 / 0
Регистрация: 16.11.2012
Сообщений: 27

Как побайтно считать информацию из исполняемого файла - C++

21.11.2012, 01:39. Просмотров 2160. Ответов 6
Метки (Все метки)

вы не смотрите на убогий код, который не юзает стринг, потому что я тогда еще не знал про стринг

итак, мое задание - считать бинарник и подсчитать частоты каждого байта

например:

текст в бинарнике: " " (то есть два пробельчика)
соответственно прога воспринимает это так
00100000 00100000
и выводит:
00100000 - 2 раза
01000000 - 1 раз
10000000 - 1 раз
00000001 - 1 раз
и т.д.

проблема - не хочет читать файл explorer.exe
с доступом все ок.

самое главное: в режиме отладки - ждет секунд десять и выводит результаты (довольно таки объемные)
т.е. главный вопрос: почему в режиме отладки все ок, а при независимом запуске - неок?

код программы:

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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <iostream>
#include <fstream>
using namespace std;
 
unsigned char  getbyte (int); // Прочитать байт начиная с i-го бита
char* ToBin   (int); // Вернуть строку нулей и единиц, соответствующую двоичному отображению параметра
ifstream in;
 
int main()
{
    cout<<"Enter name of input file: ";
    char* name=new char[1];
    cin>>name;
    in.open(name, ios::in     | // считывание
                  ios::binary | // бинарного файла
                  ios::ate   ); // открыть в конце
    if (!in.is_open())
    {
        cout<<"Error";
        cin.get();
        return -1;
    }
 
    int bytes[256]; // Будет хранить частоты каждого байта. Например, n[5] - частота байта 0000010
    for (int i=0; i<256; i++) bytes[i]=0;
    
    in.seekg(0,ios::end);
    long size=in.tellg(); //Узнали размер
 
    cout<<endl<<"File: "<<endl<<endl; // Вывели файл в виде единиц и нулей
    for (int i=0; i<size; i++)
    {
        for (int j=0; j<8; j++) 
            cout<<ToBin((int)getbyte(i*8))[j];
        cout<<' ';
    }
 
    for (int i=0; i<=size*8-8; i++) // посчитали
            bytes[getbyte(i)]++; 
    cout<<endl<<endl;
 
    for (int i=0; i<256; i++) //вывели результат
    {
        if (bytes[i]!=0)
        {
            cout<<"Byte ";
            for (int j=0; j<8; j++) cout<<ToBin(i)[j];
            cout<<" met "<<bytes[i]<<" times in this file"<<endl;
        }
    }
    cout<<endl;
    //нашли и вывели самый часто встречающийся байт
    int max=0;
    for (int i=1; i<256; i++) if (bytes[i]>bytes[max]) max=i; 
    cout<<"The most often byte is ";
    for (int j=0; j<8; j++) cout<<ToBin(max)[j];
    cout<<" - "<<bytes[max]<<" times";
    cin.get();
    cin.get();
}
 
char* ToBin(int n)
{
    char* ret=new char[8];
    for (int i=7; i>=0; i--)
        ret[7-i]=48+(n>>i)%2; //Будет присвоено 48 или 49 что соответствует коду нуля и единицы
    return ret;
}   
 
unsigned char getbyte(int pos)
{
    in.seekg(pos/8);                     // переместиться чтоб считать тот байт, где содержится запрашиваемый бит
    char c;
    in.get(c);                           // читаем
    if (pos%8==0) return c;              // возвращаем сразу считанное, если считываем с начала байта
    char c1;                
    in.get(c1);                          // иначе считываем следующий за ним байт
    return (c<<(pos%8))+(c1>>(8-(pos%8))); 
}   
 
    /* например, надо считать 10101010 10110100 11111111 начиная с 11 позиции
    с  = 10110100
    c1 = 11111111
    c  << (pos%8)   = 10110100  << 3 = 10100000
    c1 >> (8-pos%8) = 11111111  >> 5 = 00000111
 
    c + c1 = 10100000
           + 00000111
           = 10100111
Добавлено через 15 минут
если кто желает запустить на своем компе: уберите часть кода, где выводится содержимое файла, думаю понимаете почему)

Добавлено через 1 час 45 минут
отзовитесь пожалуйста ! у меня голова кругом
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 17:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru