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

Реализация CRC32 - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Даниил Павлов
1 / 1 / 0
Регистрация: 06.05.2010
Сообщений: 33
24.12.2010, 09:26     Реализация CRC32 #1
Здраствуйте, помогите реализовать контрольцелостности dll библиотеки, с помощью CRC32.
Писал CRC16, а вот CRC32 не выходит.

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
90
91
92
93
94
95
96
97
98
#include <tchar.h>
#include <windows.h>
 
WORD MakeCRC16(BYTE *buf, WORD Num)
{
    WORD Polynom16=0x8005;
    WORD CRCHL;//хранит текущую CRC
    BYTE CRCBUF;//буфер для очередного байта сообщения
    BYTE i;
    WORD n,c;
    
//первые два байта сообщения
    CRCHL=((WORD)buf[0])<<8 | buf[1];
    //по очереди достаём все байты сообщения
    for(n=2;n<Num;n++)
    {
//кладём в буфер очередной байт сообщения
        CRCBUF=buf[n];
//и побитно вдвигаем его в CRCHL
        for(i=0;i<8;i++)
        {
//бит, выдвинутый слева из CRCHL (bool!!)
            c=CRCHL & 0x8000;
//сдвиг CRCHL и вдвигание старшего бита из CRCBUF
            CRCHL=CRCHL<<1 | CRCBUF>>7;
//сдвиг CRCBUF
            CRCBUF=CRCBUF<<1;
//если из CRCHL вначале был выдвинут ненулевой бит, то xor
            if(c)CRCHL^=Polynom16;
        }
    }
 
//"добавляем в конец сообщения ещё 2 нулевых байта"
    for(i=0;i<16;i++)
    {
//бит, выдвинутый слева из CRCHL (bool!!)
        c=CRCHL & 0x8000;
//сдвиг CRCHL и вдвигание нуля из CRCBUF
        CRCHL=CRCHL<<1;
//если из CRCHL вначале был выдвинут ненулевой бит,то xor
        if(c)CRCHL^=Polynom16;
    }
    return CRCHL;
}
 
bool CheckFile(LPCTSTR filename)
{
    bool b=true;
    HANDLE h=CreateFile(filename,GENERIC_READ,FILE_SHARE_READ,0,
        OPEN_EXISTING,0,0);
    if(h==INVALID_HANDLE_VALUE) 
        return false;
    DWORD dwSize;
    // Размер файла без размера записанного CRC.
    dwSize=GetFileSize(h,0)-2;
    PBYTE pMem=new BYTE[dwSize];
    if(pMem==0)
        return false;
    DWORD dwCount;
    ReadFile(h,pMem,dwSize,&dwCount,0);
    WORD qw=MakeCRC16(pMem,(WORD)dwSize);
    
    // Считываем CRC.
    PBYTE pMemCRC=new BYTE[2];
    ReadFile(h,pMemCRC,2,&dwCount,0);
    WORD crc=*(WORD*)pMemCRC;
 
    CloseHandle(h);
    delete [] pMem;
    delete [] pMemCRC;
    if (crc==qw)
        return true;
    else 
        return false;
}
 
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, LPVOID Rez)
{
    switch (dwReason) 
    {
        case DLL_PROCESS_ATTACH:
        {
            TCHAR Buf[MAX_PATH]; // MAX_PATH - максимальная длина строки с путём.
            GetModuleFileName(hModule,Buf,MAX_PATH);
            BOOL b=CheckFile((LPCTSTR)Buf);
            if(!b)
                return FALSE;
            break;
        }
        case DLL_THREAD_ATTACH:
            break;
        case DLL_THREAD_DETACH:
            break;
        case DLL_PROCESS_DETACH:
            break;
    }
    return(TRUE); 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.12.2010, 09:26     Реализация CRC32
Посмотрите здесь:

Получить хеш файла (CRC32, MD5, SHA1, TTH, ED2K, BitPrint, AICH....) C++
C++ Реализация стека
C++ Реализация
C++ русские буквы в именах файлов меняют CRC32
C++ Реализация идеи
C++ Вычислительная сложность CRC32
C++ Как вычисляется CRC32 в exe файле по адресу PE header + 0x8
CRC32 C++. Не могу заставить работать готовый код C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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