Поиск:

Ответ в темуСоздание новой темы Создание опроса
> подсчет md5 файла, кто сталкивался с таким? 
:(
    Опции темы
Atilla360
  Дата 5.12.2009, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 28.10.2009

Репутация: нет
Всего: нет



вобщем, необходимо написать программу по нахождению md5 файла .

почитал факи
http://sources.ru/builder/faq/118.html
http://sources.ru/builder/faq/115.html

получилось реализовать подсчет для строки , которая береться с эдита.

А вот с файлом не пойму как присобачить)

Понял что надо использовать эти функции

MD5Init
MD5Update
MD5Final

но как прочитать файл по частям в масив, а потом посчитать хеш для этих частей, и через MD5Final получить хеш всего файла - непанятна.

Подскажите пожалуйста кто стыкался с таким

Спасибо 
PM MAIL   Вверх
smoke_man
Дата 6.12.2009, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 25.1.2007
Где: Рязань

Репутация: 9
Всего: 17



Можно так:
Код

  int length;
  char * buffer;

  ifstream is;
  is.open ("test.txt", ios::binary );

  // Размер файла:
  is.seekg (0, ios::end);
  length = is.tellg();
  is.seekg (0, ios::beg);

  // выделяем память:
  buffer = new char [length];

  // читаем файл:
  is.read (buffer,length);
  is.close();
  //Вычисляем md5
  ....
 //Удаляем буффер
 delete [] buffer;




--------------------
0x2b|~0x2b
PM MAIL ICQ GTalk   Вверх
xvr
Дата 7.12.2009, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Библиотечка:
Код

// Header file
class FileMap {
 HANDLE map_h;
 __int64 fsize;
 void* org_start;

public:
 FileMap();
 FileMap(AnsiString, unsigned size=0, unsigned __int64 shift=0);
 ~FileMap() {close();}

 bool open(AnsiString); // return true in error case
 void close();
 bool map(unsigned size=0, unsigned __int64 shift=0); // return true in error case
 void unmap();

 char* start;
 int size;

 __int64 get_fsize() {return fsize;}
};

// CPP file
FileMap::FileMap()
{
 map_h=0; start=0; size=0; fsize=-1; org_start=0;
}

FileMap::FileMap(AnsiString fn, unsigned isize, unsigned __int64 shift)
{
 map_h=0; start=0; size=0; fsize=-1; org_start=0;
 if (!fn.IsEmpty())
  {if (open(fn)) return;
   if (isize!=-1) map(isize,shift);}
}

// return true in error case
bool FileMap::open(AnsiString fn)
{
 close();
 HANDLE h=CreateFile(fn.c_str(),GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
 if (h==INVALID_HANDLE_VALUE) return true;
 DWORD hi, low=GetFileSize(h,&hi);
 if (low==-1 && GetLastError()) {CloseHandle(h); return true;}
 fsize=(((unsigned __int64)(hi))<<32)|low;
 map_h=CreateFileMapping(h,0,PAGE_READONLY,0,0,0);
 CloseHandle(h);
 return map_h==0;
}

void FileMap::close()
{
 unmap(); fsize=-1;
 if (map_h) {CloseHandle(map_h); map_h=NULL;}
}

// return true in error case
bool FileMap::map(unsigned isize, unsigned __int64 shift)
{
 unsigned shift1=0;
 unmap();
 if (isize==0) isize=fsize;
 if (__int64(shift)+isize>fsize) isize=fsize-shift;
 size=isize;
 if (shift)
  {
   SYSTEM_INFO si;
   GetSystemInfo(&si);
   shift1=(si.dwAllocationGranularity-1)&shift;
   shift-=shift1;
   isize+=shift1;
  }
 org_start=MapViewOfFile(map_h,FILE_MAP_READ,shift>>32,shift,isize);
 start=shift1+(char*)org_start;
 return org_start==NULL; 
}

void FileMap::unmap()
{
 if (org_start) UnmapViewOfFile(org_start);
 start=0; size=0; org_start=0;
}


Использование:
Код

FileMap file("you.file.name.txt");

...
MD5Update(file.start,file.size);
...


PM MAIL   Вверх
Atilla360
  Дата 7.12.2009, 21:45 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 28.10.2009

Репутация: нет
Всего: нет



xvr, а поподробне можно?
просто выбивает пару ошибок сдесь
Код


 if ([color=red]low==-1[/color] && GetLastError()) {CloseHandle(h); return true;}





smoke_man, щас попробую
PM MAIL   Вверх
xvr
Дата 7.12.2009, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Atilla360 @ 7.12.2009,  21:45)
xvr, а поподробне можно?
просто выбивает пару ошибок сдесь
Код


 if ([color=red]low==-1[/color] && GetLastError()) {CloseHandle(h); return true;}


Каких именно ошибок? У меня на BCB6.0 этот код работает (взят из реального проекта)

PM MAIL   Вверх
Atilla360
  Дата 8.12.2009, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 28.10.2009

Репутация: нет
Всего: нет



ошибки вроде как устранил, но все равно не работает...

Цитата(xvr @  7.12.2009,  23:34 Найти цитируемый пост)
Каких именно ошибок? У меня на BCB6.0 этот код работает (взят из реального проекта)


а пример проекта можно?
PM MAIL   Вверх
xvr
Дата 8.12.2009, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Atilla360 @ 8.12.2009,  21:33)
ошибки вроде как устранил, но все равно не работает...

Как именно не работает?

Цитата

а пример проекта можно?
Все, что касалось FileMap приведено целиком. Остальное в проекте слишком большое и этого куска не касается.

Добавлено через 9 минут и 38 секунд
Вот законченная функция:
Код

AnsiString md5(AnsiString file_name)
{
 FileMap f(file_name);
 if (!f.start) throw Exception("File '"+file_name+"' not found");
 MD5 md;
 md.update(f.start,f.size);
 unsigned char out[16];
 md.final(out);
 AnsiString rv;
 for(int i=0;i<16;++i) rv.cat_sprintf("%02X",out[i]);
 return rv;
}


Присоединённый файл ( Кол-во скачиваний: 17 )
Присоединённый файл  md5.zip 3,85 Kb
PM MAIL   Вверх
Atilla360
  Дата 9.12.2009, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 28.10.2009

Репутация: нет
Всего: нет



все равно ошибки .... сделал как показали....(

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  md5.rar 11,02 Kb
PM MAIL   Вверх
Atilla360
  Дата 9.12.2009, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 28.10.2009

Репутация: нет
Всего: нет



все равно ошибки .... сделал как показали....(

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  md5.rar 11,02 Kb
PM MAIL   Вверх
xvr
Дата 9.12.2009, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Atilla360 @ 9.12.2009,  22:23)
все равно ошибки .... сделал как показали....(

Не как показал. Вы сделали гибрид ужа с ежом - нельзя в С++ описывать одни функции внутри других, это не Pascal  smile 
Код

AnsiString md5(AnsiString file_name)
{
 FileMap f(file_name);
 if (!f.start) throw Exception("File '"+file_name+"' not found");
 MD5 md;
 md.update(f.start,f.size);
 unsigned char out[16];
 md.final(out);
 AnsiString rv;
 for(int i=0;i<16;++i) rv.cat_sprintf("%02X",out[i]);
 return rv;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 Edit1->Text = md5("Project1.cpp");
}

И где include и .cpp модуль для FileMap ? Да и md5.cpp в проект не подключен - будет ругаться линкер


PM MAIL   Вверх
Atilla360
  Дата 9.12.2009, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 28.10.2009

Репутация: нет
Всего: нет



...

Это сообщение отредактировал(а) Atilla360 - 9.12.2009, 23:12
PM MAIL   Вверх
Atilla360
  Дата 9.12.2009, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 28.10.2009

Репутация: нет
Всего: нет



а где вставлять вот этот кусок

Код

AnsiString md5(AnsiString file_name)
{
 FileMap f(file_name);
 if (!f.start) throw Exception("File '"+file_name+"' not found");
 MD5 md;
 md.update(f.start,f.size);
 unsigned char out[16];
 md.final(out);
 AnsiString rv;
 for(int i=0;i<16;++i) rv.cat_sprintf("%02X",out[i]);
 return rv;
}


в хидер файле?


Цитата(xvr @  9.12.2009,  22:31 Найти цитируемый пост)
И где include и .cpp модуль для FileMap ? Да и md5.cpp в проект не подключен - будет ругаться линкер


#include "md5.cpp" в юните1?


Присоединённый файл ( Кол-во скачиваний: 17 )
Присоединённый файл  md5__.rar 10,98 Kb
PM MAIL   Вверх
xvr
Дата 9.12.2009, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Atilla360 @ 9.12.2009,  23:11)
а где вставлять вот этот кусок

Код

AnsiString md5(AnsiString file_name)


Он у вас правильно вставлен

Цитата

Цитата(xvr @  9.12.2009,  22:31 Найти цитируемый пост)
И где include и .cpp модуль для FileMap ? Да и md5.cpp в проект не подключен - будет ругаться линкер


#include "md5.cpp" в юните1?
Нет. Project -> Add to project: (C++ Builder Unit *.cc) - md5.cpp
Для FileMap сделать то же самое - разрезать исходник на 2 куска (.h файл и .cpp файл), .h файл вставить в unit1.cpp через include, .cpp файл добавить в проект через Project -> Add to project

PM MAIL   Вверх
Atilla360
  Дата 9.12.2009, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 28.10.2009

Репутация: нет
Всего: нет



о получилось - большое спасибо!!!))
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.3279 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.