Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
Crait
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 32
#1

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

25.10.2012, 01:53. Просмотров 1361. Ответов 28
Метки нет (Все метки)

Есть набор функций:
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 начинается идти ад и угар непонятно откуда взявшихся чисел.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2012, 01:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не работает функция в Виндовс Формс (C++):

Функция компилируется, но вызывает виндовс ошибку - C++
int main() int r=replace(str, c1, c2); return 0; int replace(char *str, char c1, char c2) { int count=0; ...

Функция cin.get(array, 80) работает в одной программе, но не работает в другой - C++
Добрый день. Я что то совсем запутался, одна и та же функция в одной программе работает, а в другой нет. В этой программе...

Не работает функция в С++ - C++
Всем привет! Вот мне надо написать функцию, которая находит максимальное среди трёх введённых чисел. Я вот накинул программку и прошу...

Не работает функция gets() - C++
Компилятор не розпознает функцию gets(); Это пример из книги Г.Шилдта &quot;С++: базовый курс&quot;. #include&lt;iostream&gt; ...

Не работает функция - C++
// Example program #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;cmath&gt; using namespace std; int main() { float x=0.2; ...

Не работает функция if - C++
Я не совсем понимаю, как мне заставить if сравнить значение переменной output1 с заданной заранее строкой. А после нахождения совпадения,...

28
MrCold
855 / 753 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
25.10.2012, 02:06 #2
Цитата Сообщение от Crait Посмотреть сообщение
работает в консольном приложении
Как применяете в консоли ? Покажите функцию main() .Пример входных данных и выход в консоли .
0
Crait
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 32
25.10.2012, 22:27  [ТС] #3
Как применяете в консоли ? Покажите функцию main() .Пример входных данных и выход в консоли .
Код в консоли:
C++
1
2
3
4
5
6
7
8
9
10
int main()
{
    string sIn;
    int A,B,C,D;
    sIn = "text";
    fstream out("out.txt");
    MD5_hash(sIn,A,B,C,D);
    out<<A<<endl<<B<<endl<<C<<endl<<D;
    return 0;
}
на выходе:
-330190308
-1411264809
-1648526684
-774328636
Код в ВФ:
C++
1
2
3
4
5
6
7
8
9
10
11
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                 string sIn;
                 String ^in;
                 in = "text";
                  MarshalString(in,sIn);
                 int A,B,C,D;
                 fstream out("out.txt");
                 MD5_hash(sIn,A,B,C,D);
                 out<<A<<endl<<B<<endl<<C<<endl<<D<<endl;
 
             }
Добавлено через 3 часа 51 минуту
Вверх!
0
I.M.
565 / 548 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
27.10.2012, 01:19 #4
а если это
C++
1
2
3
4
string sIn;
String ^in;
in = "text";
MarshalString(in,sIn);
заменить на это
C++
1
2
string sIn;
sIn = "text";
ошибка остается?
0
Crait
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 32
27.10.2012, 01:31  [ТС] #5
Цитата Сообщение от I.M. Посмотреть сообщение
а если это
C++
1
2
3
4
string sIn;
String ^in;
in = "text";
MarshalString(in,sIn);
заменить на это
C++
1
2
string sIn;
sIn = "text";
ошибка остается?
Да, остается. Первое и последнее числа, кстати, остаются неименными.
0
I.M.
565 / 548 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
27.10.2012, 03:49 #6
Crait, а если int заменить на unsigned для А,В,С,D. И в функции MD5_hash, естественно, тоже.
не пробовали отладчиком проходить по коду, чтобы найти расхождение?
1
Crait
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 32
27.10.2012, 12:55  [ТС] #7
Цитата Сообщение от I.M. Посмотреть сообщение
Crait, а если int заменить на unsigned для А,В,С,D. И в функции MD5_hash, естественно, тоже.
не пробовали отладчиком проходить по коду, чтобы найти расхождение?
Спасибо, помогло! Ошибка связана с тем, что перменной типа инт присваивалось значение ансайнд инт, верно?

Добавлено через 7 минут
А, нет, вру. Теперь меняется значение переменной B. Ну что за черт...
0
I.M.
565 / 548 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
27.10.2012, 13:12 #8
Crait, больше нигде в коде не используются знаковые типы? видимо использование крайнего разряда, отвечающего за знак, в консольном и неконсольном приложении обрабатываются по-разному.
0
Crait
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 32
28.10.2012, 16:57  [ТС] #9
Как это он должен обрабатываться, чтобы с каждым запуском выдавать разные значения?
0
Crait
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 32
19.11.2012, 23:15  [ТС] #10
Вопщем, нашел где ошибка:
C++
1
2
3
4
5
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]);
Ни то ни другое не работают нормально. Вроде бы все инициализировано. Может, проблема в (uint)? Как он работает? Что делает?

Добавлено через 1 час 20 минут
вверх!
0
Crait
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 32
22.11.2012, 02:51  [ТС] #11
Вверх!

Добавлено через 1 час 44 минуты
Это будет мой личный бложик, раз никто не хочет отвечать. Проблема, оказывается, в самом начале:
C++
1
2
for(int i=0;i<length;i++) //первые length элементов сIn
 cIn[i]=sIn[i]; //заполняем символами входного сообщения
Очевидно, что-то не так происходит с забором стринга sIn. Что делать?

Добавлено через 17 минут
Вопщем, помогите люди добрыя Символы неправильно записываются в массив чаров. То есть, какой либо сивол записывается на теми же байтами, что и в стринге, а какими-то другими. В этом вся проблема, и я не знаю, что с ней делать.
0
I.M.
565 / 548 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
22.11.2012, 11:49 #12
Crait, что значит не теми байтами? вы, случаем, не кириллицу туда пихаете?
0
Crait
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 32
25.11.2012, 22:40  [ТС] #13
Цитата Сообщение от I.M. Посмотреть сообщение
Crait, что значит не теми байтами? вы, случаем, не кириллицу туда пихаете?
Прикладываю скриншоты, чтобы было понятно. Слева результат из виндовс форм, где цифры постоянно меняются, а текст остается постоянным, справа езультат с консоли, где цифр вообще нет.
0
Миниатюры
Не работает функция в Виндовс Формс   Не работает функция в Виндовс Формс  
HighPredator
5544 / 1857 / 346
Регистрация: 10.12.2010
Сообщений: 5,479
Записей в блоге: 2
26.11.2012, 15:38 #14
Раз вы упомянули Windows Forms, то спрошу: а не CLR-приложение ли у вас?
0
Crait
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 32
26.11.2012, 15:50  [ТС] #15
Цитата Сообщение от HighPredator Посмотреть сообщение
Раз вы упомянули Windows Forms, то спрошу: а не CLR-приложение ли у вас?
CLR поддержка чистого MSIL. Как это влияет на обработку?
0
26.11.2012, 15:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2012, 15:50
Привет! Вот еще темы с ответами:

Не работает функция! - C++
Получает имя файла и возвращает позицию слова наибольшей длины. На экран выводится слово наибольшей длины. Но почемуто функция не работает!...

не работает функция! - C++
Задание таково: &quot;площадь треугольника, заданного координатами своих вершин, находится по формуле S=0.5*lx1y2+x2y3+x3y1-x1y3-x2y1-x3y2l...

Не работает функция - C++
Добрый день. Потихоньку изучаю ООП. И столкнулся с такой проблемой: Есть два файла: 1)#include &quot;BOOK.h&quot; int main() { ...

Не работает функция - C++
Не работает функция write класса Losers. Вызов происходит в 60-й строчке. #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;iomanip&gt;...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru