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

Написать небольшую прогу, которая понимает изменился ли бинарный файл или нет - C++

Восстановить пароль Регистрация
 
Warezovvv
 Аватар для Warezovvv
9 / 9 / 2
Регистрация: 09.12.2012
Сообщений: 219
13.08.2014, 22:17     Написать небольшую прогу, которая понимает изменился ли бинарный файл или нет #1
Мне нужно написать небольшую прогу, которая понимает изменился ли бинарный файл или нет.
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 <windows.h>
#include <string>
#include <iostream>
#include <fstream>
 
int main(int agrc, char** argv) 
{
    std::string fileName = "C:/GameDev/Safty Code challenger/OriginalFiles/house_24.bin";
    HFILE hFile;
    OFSTRUCT buffer;
    DWORD vwCounter;
    int     *virgRDWRbuff;
    BY_HANDLE_FILE_INFORMATION bhFileInformation;
 
    buffer.cBytes = sizeof buffer;
    hFile = OpenFile(fileName.c_str(), &buffer, OF_READ);
    if(hFile == HFILE_ERROR) 
    {
        std::cout << "No File : " <<fileName <<std::endl;
        CloseHandle(HANDLE(hFile));
    }
    //Теперь можно получить информацию о файле
    GetFileInformationByHandle(
        HANDLE(hFile),     // дескриптор файла
        &bhFileInformation //адрес структуры, в которой сохраняется информация
        );
    //Резервируем память для всего файла обычно размер файла
    //не больше  размера nFileSizeLow объявленного как DWORD
 
    int viSize = bhFileInformation.nFileSizeLow/sizeof(int);
    virgRDWRbuff = (int*) new int[viSize];
    //Сдвигаем указатель на нужный байт, конкретно здесь на начло.
    if(_llseek(hFile, 0*sizeof(int), 0) != (long) (0*sizeof(int)))
    {
        CloseHandle(HANDLE(hFile));
        std::cout<<"Error bad file " <<fileName <<std::endl;
        return -1;
    }
    if(!ReadFile(HANDLE(hFile),virgRDWRbuff,
        (DWORD)viSize*sizeof(int),&vwCounter,NULL))
    {
        //Здесь может быть сообщение об ошибке
    } else 
    {
        if(vwCounter == (DWORD)viSize*sizeof(int))
        {
            //Используем информацию
            int viRez=virgRDWRbuff[99];
        }
        else
        {
            //Здесь может быть сообщение об ошибке
        }
    }
 
    std::ofstream F;
 
    F.open("C:\\GameDev\\Safty Code challenger\\OriginalFiles\\result.txt", std::ios::app);
    
    //for(int i=0; i < 100; i++) {
    //  virgRDWRbuff[99-i]=i;
    //  F<<virgRDWRbuff[99-i];
    //}
    //
    //if(!WriteFile(HANDLE(F),virgRDWRbuff,
    //  (DWORD)viSize*sizeof(int),&vwCounter,NULL))
    //{
    //  //Здесь может быть сообщение об ошибке
    //}
    //else
    //{
    //  if(vwCounter == (DWORD)viSize*sizeof(int))
    //  {
    //      //Запись прошла успешно
 
    //  }else
    //  {
    //      //Здесь может быть сообщение об ошибке
    //  }
    //}
    //
 
 
 
    CloseHandle(HANDLE(hFile));
    delete[] virgRDWRbuff;
 
    return 0;
}
Открываю бинарник (по туторам делал). Но в конце концов не могу понять где хранится "контент" этого файла. Ну в текстовом все понятно,если 111.txt содержит "тут строка" то она и содержит эту строку о строке. Я хочу сделать следующее. Взять бинарник, вынуть из него весь его контент, захешировать, сохранить в текстовой файл типа - этот файл -этот хэш . Проверять по открытию. Все что закоменчено, жалки попытки записи в текстовый файл инфы о бинарнике

Добавлено через 1 час 23 минуты
Убрал винапи, переписал попроще. Работает. Выводит 16ричный код. Щас захэширую и создам лог. Буит работать.
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
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
// An unsigned char can store 1 Bytes (8bits) of data (0-255)
typedef unsigned char BYTE;
 
// Get the size of a file
long getFileSize(FILE *file)
{
    long lCurPos, lEndPos;
    lCurPos = ftell(file);
    fseek(file, 0, 2);
    lEndPos = ftell(file);
    fseek(file, lCurPos, 0);
    return lEndPos;
}
 
int main()
{
    const char *filePath = "C:\\GameDev\\Safty Code challenger\\OriginalFiles\\house_48.bin";   
    BYTE *fileBuf;          // Pointer to our buffered data
    FILE *file = NULL;      // File pointer
 
    // Open the file in binary mode using the "rb" format string
    // This also checks if the file exists and/or can be opened for reading correctly
    if ((file = fopen(filePath, "rb")) == NULL)
        cout << "Could not open specified file" << endl;
    else
        cout << "File opened successfully" << endl;
 
    // Get the size of the file in bytes
    long fileSize = getFileSize(file);
 
    // Allocate space in the buffer for the whole file
    fileBuf = new BYTE[fileSize];
 
    // Read the file in to the buffer
    fread(fileBuf, fileSize, 1, file);
 
    // Now that we have the entire file buffered, we can take a look at some binary infomation
    // Lets take a look in hexadecimal
    std::ofstream result;
    result.open("C:\\GameDev\\Safty Code challenger\\OriginalFiles\\result.txt",std::ios::app);
    
 
    char hexstr[201];
    int i;
    for (i = 0; i < 100; i++)
        sprintf(hexstr+i*2, "%02x", fileBuf[i]);
        //printf("%X ", fileBuf[i]);
    hexstr[i*2] = 0;
    result << string(hexstr);   
    
    result.close();
    delete[]fileBuf;
    fclose(file);   // Almost forgot this 
    return 0;
}
Добавлено через 2 часа 13 минут
Но в первом листинге, где все таки лежит заветная информация?

Добавлено через 2 часа 41 минуту
ап.Рили нужна помощь
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2014, 22:17     Написать небольшую прогу, которая понимает изменился ли бинарный файл или нет
Посмотрите здесь:

Написать прогу, которая выводит на экран содержимое файла C++
C++ Написать программу, которая дописывает в файл Phone/txt, находящийся на диске А фамилию и номер телефона. Если файла на диске нет, то программа должна
Требуется написать прогу которая преобразуют двоичное число в десятичное C++
C++ Написать программу, которая определяет симметричный массив или нет
Бинарные файлы. Написать функцию, которая записывает в бинарный файл N случайных вещественных чисел в указанном диапазоне C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mishelle92
57 / 56 / 19
Регистрация: 09.10.2012
Сообщений: 179
Завершенные тесты: 1
13.08.2014, 22:59     Написать небольшую прогу, которая понимает изменился ли бинарный файл или нет #2
Цитата Сообщение от Warezovvv Посмотреть сообщение
Но в первом листинге, где все таки лежит заветная информация?
Во втором параметре функции ReadFile. Хоть с WinAPI, хоть без - результат чтения файла - массив данных. Далее его обрабатывайте, как нужно.
MousePro
49 / 30 / 1
Регистрация: 25.04.2013
Сообщений: 366
13.08.2014, 23:01     Написать небольшую прогу, которая понимает изменился ли бинарный файл или нет #3
может я конечно туплю, но не проще ли проверить время последнего изменения ?
DrOffset
6419 / 3793 / 877
Регистрация: 30.01.2014
Сообщений: 6,581
13.08.2014, 23:06     Написать небольшую прогу, которая понимает изменился ли бинарный файл или нет #4
MousePro, а если один байт в файле поменяли, сохранили, потом вернули обратно и снова сохранили?
В этом случае время последнего изменения нас дезинформирует.

Добавлено через 1 минуту
Warezovvv, ответ тебе вроде уже дали. Если интересно, можешь еще вот тут посмотреть.
Warezovvv
 Аватар для Warezovvv
9 / 9 / 2
Регистрация: 09.12.2012
Сообщений: 219
13.08.2014, 23:12  [ТС]     Написать небольшую прогу, которая понимает изменился ли бинарный файл или нет #5
Цитата Сообщение от mishelle92 Посмотреть сообщение
Во втором параметре функции ReadFile. Хоть с WinAPI, хоть без - результат чтения файла - массив данных. Далее его обрабатывайте, как нужно.
virgRDWRbuff. Как его записать в .txt файл посредством
C++
1
2
WriteFile(HANDLE(F),virgRDWRbuff,
      (DWORD)viSize*sizeof(int),&vwCounter,NULL)
?
DrOffset
6419 / 3793 / 877
Регистрация: 30.01.2014
Сообщений: 6,581
13.08.2014, 23:20     Написать небольшую прогу, которая понимает изменился ли бинарный файл или нет #6
Warezovvv,
см. параметры.
Размер считанных данных тебе вернула функция ReadFile через параметр vwCounter.
C++
1
2
DWORD written;
WriteFile(hFileOut, virgRDWRbuff, vwCounter, &written,NULL)
Добавлено через 2 минуты
Файл новый нужно через OpenFile открыть. std::fstream тут как бы не при чем вообще
mishelle92
57 / 56 / 19
Регистрация: 09.10.2012
Сообщений: 179
Завершенные тесты: 1
13.08.2014, 23:21     Написать небольшую прогу, которая понимает изменился ли бинарный файл или нет #7
Там же, кстати пример.
Warezovvv
 Аватар для Warezovvv
9 / 9 / 2
Регистрация: 09.12.2012
Сообщений: 219
13.08.2014, 23:29  [ТС]     Написать небольшую прогу, которая понимает изменился ли бинарный файл или нет #8
Т.е. поидее через
C++
1
2
DWORD written;
WriteFile(hFileOut, virgRDWRbuff, vwCounter, &written,NULL)
, изменив файл, virgRDWRbuff которого я высчитывал, изменив этот файл и высчитав еще раз и сравнив, значения virgRDWRbuff будут разные?
ну т.е. пустой ass.txt против ass.txt с "1" в тексте. У них virgRDWRbuff будут разные?
DrOffset
6419 / 3793 / 877
Регистрация: 30.01.2014
Сообщений: 6,581
14.08.2014, 00:26     Написать небольшую прогу, которая понимает изменился ли бинарный файл или нет #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Warezovvv Посмотреть сообщение
У них virgRDWRbuff будут разные?
virgRDWRbuff - это же массив. Если ты прочитал файл, потом этот файл изменил, потом еще раз его прочитал, то да, какие-то из множества байтов будут отличаться.
Warezovvv
 Аватар для Warezovvv
9 / 9 / 2
Регистрация: 09.12.2012
Сообщений: 219
14.08.2014, 01:02  [ТС]     Написать небольшую прогу, которая понимает изменился ли бинарный файл или нет #10
virgRDWRbuff записываю в файл от 0 до 99. Не изменяю файл, разные значения.

Добавлено через 6 минут
Фотка в лог файле два разных значения одного неизменяемого файла (
gazlan
2855 / 1803 / 271
Регистрация: 27.08.2010
Сообщений: 4,883
Записей в блоге: 1
14.08.2014, 01:05     Написать небольшую прогу, которая понимает изменился ли бинарный файл или нет #11
Цитата Сообщение от Warezovvv Посмотреть сообщение
которая понимает изменился ли бинарный файл или нет
Hash. Любой. В зависимости от требуемой стойкости - от CRC32 ... и дальше вверх.

Если нужен быстрый хэш - рекомендую MurmurHash3, если стойкий - BLAKE2

//Резервируем память для всего файла обычно размер файла
Забудьте про этот бред. Навсегда.
Warezovvv
 Аватар для Warezovvv
9 / 9 / 2
Регистрация: 09.12.2012
Сообщений: 219
14.08.2014, 02:17  [ТС]     Написать небольшую прогу, которая понимает изменился ли бинарный файл или нет #12
Цитата Сообщение от gazlan Посмотреть сообщение
Забудьте про этот бред. Навсегда.
Уроки брал отсюда

Добавлено через 1 минуту
Цитата Сообщение от gazlan Посмотреть сообщение
Hash. Любой.
Я не очень понимаю как это к файлам относится. Я думал что хэш обычно для строк. Захэшировал и получай доступ прыгая прям на него. Всё. А что тут. Ну вы видели мой код программы, что дальше. Щас подключу буст с CRC. А дальше я в тупике. А SHA-1/MD5 нельзя использовать?

Добавлено через 14 минут
Цитата Сообщение от Warezovvv Посмотреть сообщение
MD5
Понял почему нет. Ну вообщем как использовать CRC32 относительно бинарника имея мои исходники?(

Добавлено через 48 минут
использовал буст, отличная либа. Но все таки как без буста можно было разобраться, подскажите.
gazlan
2855 / 1803 / 271
Регистрация: 27.08.2010
Сообщений: 4,883
Записей в блоге: 1
14.08.2014, 03:22     Написать небольшую прогу, которая понимает изменился ли бинарный файл или нет #13
Цитата Сообщение от Warezovvv Посмотреть сообщение
хэш обычно для строк
Для любого набора байт. Как частный случай - массив (строка).

SHA-1/MD5 нельзя использовать?
Можно, разумеется. Как и любые другие. Я назвал предпочтительные.

как использовать CRC32
  1. Сделать мэппинг файла в память
  2. Посчитать CRC32 для View

Пример использования недокументированной функции Windows

Цитата Сообщение от Warezovvv Посмотреть сообщение
использовал буст
Из пушки - по воробьям.

Даже на этом форуме десятки раз обсуждалось вычисление CRC. Воспользуйтесь поиском.

Один (старый) пример в эташе.
Вложения
Тип файла: 7z crc.7z (13.7 Кб, 5 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2014, 09:48     Написать небольшую прогу, которая понимает изменился ли бинарный файл или нет
Еще ссылки по теме:

C++ Написать небольшую программку с мелкими функциями удаленного контроля другого компьютера по LAN или Wi-Fi
Ошибка при записи или чтении в бинарный файл C++
C++ Написать прогу которая заменяет одну строку на другую

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

Или воспользуйтесь поиском по форуму:
DrOffset
6419 / 3793 / 877
Регистрация: 30.01.2014
Сообщений: 6,581
14.08.2014, 09:48     Написать небольшую прогу, которая понимает изменился ли бинарный файл или нет #14
Цитата Сообщение от Warezovvv Посмотреть сообщение
Не изменяю файл, разные значения.
Лучше бы показал как сравниваешь.

Добавлено через 5 минут
Цитата Сообщение от gazlan Посмотреть сообщение
Из пушки - по воробьям.
Если буст уже установлен, а библиотека оттуда не тащит зависимостей (как, например в случае crc), то ничего страшного в нем нет.
Я бы сказал, наоборот, из пушки по воробъям использовать для этого недокументированную функцию windows. Но это мое мнение.

Хотя вот свой вариант написать - это полезно в данном случае, автор же учится. В любом случае в бусте полезно будет подсмотреть подход к вычислению crc с использованием чанков, 100% автору пригодится в будущем и не только для таких задач.
Yandex
Объявления
14.08.2014, 09:48     Написать небольшую прогу, которая понимает изменился ли бинарный файл или нет
Ответ Создать тему
Опции темы

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