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

Не работает функция в Виндовс Формс - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
Crait
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 32
25.10.2012, 01:53     Не работает функция в Виндовс Формс #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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#include <string>
#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
typedef unsigned int uint;
uint F(uint X, uint Y, uint Z)
{
return (X & Y) | ((~X) & Z);
}
uint G(uint X, uint Y, uint Z)
{
return (X & Z) | (Y & (~Z));
}
uint H(uint X, uint Y, uint Z)
{
return X ^ Y ^ Z;
}
uint I(uint X, uint Y, uint Z)
{
return Y ^ (X | (~Z));
}
uint RotateLeft(uint value, int shift)
{
return value << shift | value >> (32-shift);
}
 
void MD5_hash(string sIn, int &A,int &B,int &C, int &D)
{
 
int length=sIn.size(); //получаем длину входного сообщения.
int rests=length%64; //остаток от деления на 64байта.
int size = 0; //тут будет храниться размер сообщения после первых 2ух шагов.
 
//Шаг 1.
if(rests < 56) //если остаток от деления на 64 меньше 56
 size=length-rests+56+8; //подгоняем размер так, что бы он был кратен 64(+8 байт для 2ого шага).
else //иначе (если остаток больше 56)
 size=length+64-rests+56+8; //подгоняем размер так, что бы он был кратен 64(+8 байт для 2ого шага).
 
char *cIn=new char[size]; //создаем динамический массив для хранения сообщения, которое далее будет кодироваться
 
for(int i=0;i<length;i++) //первые length элементов сIn
 cIn[i]=sIn[i]; //заполняем символами входного сообщения
 
cIn[length]=0x80; //савим в конец сообщения единичный бит.
 
for(int i=length+1;i<size;i++) //а все остальное
 cIn[i]=0; //заполняем нулями
 
//Шаг 2.
__int64 bitLength=(uint)(length)*8; //длина сообщения в битах.
 
for(int i=0;i<8;i++) //последние 8 байт
 cIn[size-8+i]=(bitLength >> i*8); //заполняем 64-битным представлением длины данных до выравнивания
 
//Шаг 3.
A=0x67452301, //Инициализируем начальные значения регистров.
B=0xefcdab89,
C=0x98badcfe,
D=0x10325476;
uint T[64]; //64-элементная таблица данных (констатнт).
 
for(int i=0;i<63;i++) //всю таблицу констант
 T[i]= pow(2.0,32.0)*fabs(sin(i*1.0)); //заполняем в соответствии с алгоритмом.
 
uint *X=new uint[size/4]; //создаем массив Х, в котором будет 32-разрядное представление сообщения.
 
X=(uint*)(cIn); //загоняем в массив Х сообщение cIn(в данном случае оно само разбиваеться на 32-разрядные слова).
 
//или это можно сделать "вручную" следующим образом:
//for(int i = 0; i <size/4; i++ )
 //X[ i] =(uint)(cIn[ i*4 + 3]<<24) +(uint)(cIn [i*4 + 2]<<16) + (uint)(cIn[i*4 + 1]<<8) + (uint)(cIn [i*4 + 0]);
 
//Шаг 4.
uint AA, BB, CC, DD;
 
for(int i=0;i<size/4;i+=16)
 {
 AA = A;BB = B; CC = C; DD = D;
 
 //раунд 1
 A = B + RotateLeft((A + F(B,C,D) + X[i+ 0] + T[ 1]),  7);
 D = A + RotateLeft((D + F(A,B,C) + X[i+ 1] + T[ 2]), 12);
 C = D + RotateLeft((C + F(D,A,B) + X[i+ 2] + T[ 3]), 17);
 B = C + RotateLeft((B + F(C,D,A) + X[i+ 3] + T[ 4]), 22);
 
 A = B + RotateLeft((A + F(B,C,D) + X[i+ 4] + T[ 5]),  7);
 D = A + RotateLeft((D + F(A,B,C) + X[i+ 5] + T[ 6]), 12);
 C = D + RotateLeft((C + F(D,A,B) + X[i+ 6] + T[ 7]), 17);
 B = C + RotateLeft((B + F(C,D,A) + X[i+ 7] + T[ 8]), 22);
 
 A = B + RotateLeft((A + F(B,C,D) + X[i+ 8] + T[ 9]),  7);
 D = A + RotateLeft((D + F(A,B,C) + X[i+ 9] + T[10]), 12);
 C = D + RotateLeft((C + F(D,A,B) + X[i+10] + T[11]), 17);
 B = C + RotateLeft((B + F(C,D,A) + X[i+11] + T[12]), 22);
 
 A = B + RotateLeft((A + F(B,C,D) + X[i+12] + T[13]),  7);
 D = A + RotateLeft((D + F(A,B,C) + X[i+13] + T[14]), 12);
 C = D + RotateLeft((C + F(D,A,B) + X[i+14] + T[15]), 17);
 B = C + RotateLeft((B + F(C,D,A) + X[i+15] + T[16]), 22);
 
 //раунд 2
 A = B + RotateLeft((A + G(B,C,D) + X[i+ 1] + T[17]),  5);
 D = A + RotateLeft((D + G(A,B,C) + X[i+ 6] + T[18]),  9);
 C = D + RotateLeft((C + G(D,A,B) + X[i+11] + T[19]), 14);
 B = C + RotateLeft((B + G(C,D,A) + X[i+ 0] + T[20]), 20);
 
 A = B + RotateLeft((A + G(B,C,D) + X[i+ 5] + T[21]),  5);
 D = A + RotateLeft((D + G(A,B,C) + X[i+10] + T[22]),  9);
 C = D + RotateLeft((C + G(D,A,B) + X[i+15] + T[23]), 14);
 B = C + RotateLeft((B + G(C,D,A) + X[i+ 4] + T[24]), 20);
 
 A = B + RotateLeft((A + G(B,C,D) + X[i+ 9] + T[25]),  5);
 D = A + RotateLeft((D + G(A,B,C) + X[i+14] + T[26]),  9);
 C = D + RotateLeft((C + G(D,A,B) + X[i+ 3] + T[27]), 14);
 B = C + RotateLeft((B + G(C,D,A) + X[i+ 8] + T[28]), 20);
 
 A = B + RotateLeft((A + G(B,C,D) + X[i+13] + T[29]),  5);
 D = A + RotateLeft((D + G(A,B,C) + X[i+ 2] + T[30]),  9);
 C = D + RotateLeft((C + G(D,A,B) + X[i+ 7] + T[31]), 14);
 B = C + RotateLeft((B + G(C,D,A) + X[i+12] + T[32]), 20);
 
 //раунд 3
 A = B + RotateLeft((A + H(B,C,D) + X[i+ 5] + T[33]),  4);
 D = A + RotateLeft((D + H(A,B,C) + X[i+ 8] + T[34]), 11);
 C = D + RotateLeft((C + H(D,A,B) + X[i+11] + T[35]), 16);
 B = C + RotateLeft((B + H(C,D,A) + X[i+14] + T[36]), 23);
 
 A = B + RotateLeft((A + H(B,C,D) + X[i+ 1] + T[37]),  4);
 D = A + RotateLeft((D + H(A,B,C) + X[i+ 4] + T[38]), 11);
 C = D + RotateLeft((C + H(D,A,B) + X[i+ 7] + T[39]), 16);
 B = C + RotateLeft((B + H(C,D,A) + X[i+10] + T[40]), 23);
 
 A = B + RotateLeft((A + H(B,C,D) + X[i+13] + T[41]),  4);
 D = A + RotateLeft((D + H(A,B,C) + X[i+ 0] + T[42]), 11);
 C = D + RotateLeft((C + H(D,A,B) + X[i+ 3] + T[43]), 16);
 B = C + RotateLeft((B + H(C,D,A) + X[i+ 6] + T[44]), 23);
 
 A = B + RotateLeft((A + H(B,C,D) + X[i+ 9] + T[45]),  4);
 D = A + RotateLeft((D + H(A,B,C) + X[i+12] + T[46]), 11);
 C = D + RotateLeft((C + H(D,A,B) + X[i+15] + T[47]), 16);
 B = C + RotateLeft((B + H(C,D,A) + X[i+ 2] + T[48]), 23);
 
 //раунд 4
 A = B + RotateLeft((A + I(B,C,D) + X[i+ 0] + T[49]),  6);
 D = A + RotateLeft((D + I(A,B,C) + X[i+ 7] + T[50]), 10);
 C = D + RotateLeft((C + I(D,A,B) + X[i+14] + T[51]), 15);
 B = C + RotateLeft((B + I(C,D,A) + X[i+ 5] + T[52]), 21);
 
 A = B + RotateLeft((A + I(B,C,D) + X[i+12] + T[53]),  6);
 D = A + RotateLeft((D + I(A,B,C) + X[i+ 3] + T[54]), 10);
 C = D + RotateLeft((C + I(D,A,B) + X[i+10] + T[55]), 15);
 B = C + RotateLeft((B + I(C,D,A) + X[i+ 1] + T[56]), 21);
 
 A = B + RotateLeft((A + I(B,C,D) + X[i+ 8] + T[57]),  6);
 D = A + RotateLeft((D + I(A,B,C) + X[i+15] + T[58]), 10);
 C = D + RotateLeft((C + I(D,A,B) + X[i+ 6] + T[59]), 15);
 B = C + RotateLeft((B + I(C,D,A) + X[i+13] + T[60]), 21);
 
 A = B + RotateLeft((A + I(B,C,D) + X[i+ 4] + T[61]),  6);
 D = A + RotateLeft((D + I(A,B,C) + X[i+11] + T[62]), 10);
 C = D + RotateLeft((C + I(D,A,B) + X[i+ 2] + T[63]), 15);
 B = C + RotateLeft((B + I(C,D,A) + X[i+ 9] + T[64]), 21);
 
 A = AA + A;
 B = BB + B;
 C = CC + C;
 D = DD + D;
}
unsigned char key[4];
key[0] = A;
key[1] = B;
key[2] = C;
key[3] = D;
 
}
И этот набор нормально работает в консольном приложении, но выдает разный выход на одинаковые входные данные в виндовс форм. В чем может быть дело? Проблема начинается с числа B, число А всегда идет одинаковое. Только с B начинается идти ад и угар непонятно откуда взявшихся чисел.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2012, 01:53     Не работает функция в Виндовс Формс
Посмотрите здесь:

C++ Функция компилируется, но вызывает виндовс ошибку
C++ не работает функция!
C++ Не работает функция в С++
Не работает функция. Списки. C++
Не работает функция! C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HighPredator
 Аватар для HighPredator
5350 / 1733 / 320
Регистрация: 10.12.2010
Сообщений: 5,119
Записей в блоге: 3
28.11.2012, 14:01     Не работает функция в Виндовс Формс #21
Цитата Сообщение от Crait Посмотреть сообщение
что в свою очередь приводит к случайному, если можно так сказать, заполнению массива X[].
Это происходит при одном и том же содержимом строки?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Crait
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 32
30.11.2012, 23:29  [ТС]     Не работает функция в Виндовс Формс #22
Цитата Сообщение от HighPredator Посмотреть сообщение
Это происходит при одном и том же содержимом строки?
Да. Посмотрите на скриншоты. Содержимое строки одно и то же, специально чтобы убедиться в этом, я начал задавать ее как
C++
1
string sIn = "text";
Но цифры, слева от строки какждый раз разные. Я думаю, проблема в них, на большее моих знаний не хватает.

Добавлено через 20 часов 50 минут
Вверх!

Добавлено через 21 час 52 минуты
вверх!

Добавлено через 8 часов 23 минуты
Вверх!
Crait
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 32
13.12.2012, 02:05  [ТС]     Не работает функция в Виндовс Формс #23
Забавный факт: если в отладчике консольного приложения включить конфигурацию Release, то оно будет глючить точно так же.
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
13.12.2012, 02:18     Не работает функция в Виндовс Формс #24
Crait, за месяц с лишним можно было хоть задание озвучить .
Crait
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 32
13.12.2012, 13:18  [ТС]     Не работает функция в Виндовс Формс #25
Цитата Сообщение от MrCold Посмотреть сообщение
Crait, за месяц с лишним можно было хоть задание озвучить .
Что значит "Озвучить задание"? Как и где его озвучивать?
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
13.12.2012, 13:23     Не работает функция в Виндовс Формс #26
Напишите задание полностью, так будет легче помочь
Crait
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 32
13.12.2012, 17:52  [ТС]     Не работает функция в Виндовс Формс #27
Задание - написать алгоритм, выдающий MD5 хэш. Собственно, он уже написан, и в консоли отлично работает под дебаг модом. Но в релизе и в виндовс форм ( в формах в любой конфигурации ) не работает ничего: получаем на выходе случайный хэш.
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
14.12.2012, 18:32     Не работает функция в Виндовс Формс #28
Цитата Сообщение от Crait Посмотреть сообщение
Задание - написать алгоритм, выдающий MD5 хэш.
Далее код
Цитата Сообщение от Crait Посмотреть сообщение
AES_Windowed
AES тут зачем ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2012, 21:26     Не работает функция в Виндовс Формс
Еще ссылки по теме:

Почему не работает функция? C++
Не работает функция gets() C++
C++ Не работает функция

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

Или воспользуйтесь поиском по форуму:
Crait
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 32
17.12.2012, 21:26  [ТС]     Не работает функция в Виндовс Формс #29
Все исправил. Проблема мелкая совсем оказалась: обращение к 64 элементу массива T.
Yandex
Объявления
17.12.2012, 21:26     Не работает функция в Виндовс Формс
Ответ Создать тему
Опции темы

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