Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 32
1

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

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

Author24 — интернет-сервис помощи студентам
Есть набор функций:
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.10.2012, 01:53
Ответы с готовыми решениями:

Перемещение объектов в Виндовс Формс
Как перемещать объект кнопками в виндовс форм . Просто пытаюсь привязать на клавиатура у меня...

Использование собственного класса в Виндовс Формс
Надо сделать программу на Windows Forms. По сути ето типа база данных транспортных средств должа...

Нужно переделать консольное приложение под виндовс формс
код using System; using System.Collections.Generic; using System.Linq; using System.Text;...

Стояла вин 7, второй установила виндовс 8.1. Теперь в виндовс 7 не работает мышь
у меня виндовс 7,но я теперь захотела еще и вторую установить.установила 8.1.казалось бы все...

28
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
28.11.2012, 14:01 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Crait Посмотреть сообщение
что в свою очередь приводит к случайному, если можно так сказать, заполнению массива X[].
Это происходит при одном и том же содержимом строки?
0
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 минуты
Вверх!
0
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 32
13.12.2012, 02:05  [ТС] 23
Забавный факт: если в отладчике консольного приложения включить конфигурацию Release, то оно будет глючить точно так же.
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
13.12.2012, 02:18 24
Crait, за месяц с лишним можно было хоть задание озвучить .
0
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 32
13.12.2012, 13:18  [ТС] 25
Цитата Сообщение от MrCold Посмотреть сообщение
Crait, за месяц с лишним можно было хоть задание озвучить .
Что значит "Озвучить задание"? Как и где его озвучивать?
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
13.12.2012, 13:23 26
Напишите задание полностью, так будет легче помочь
0
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 32
13.12.2012, 17:52  [ТС] 27
Задание - написать алгоритм, выдающий MD5 хэш. Собственно, он уже написан, и в консоли отлично работает под дебаг модом. Но в релизе и в виндовс форм ( в формах в любой конфигурации ) не работает ничего: получаем на выходе случайный хэш.
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
14.12.2012, 18:32 28
Цитата Сообщение от Crait Посмотреть сообщение
Задание - написать алгоритм, выдающий MD5 хэш.
Далее код
Цитата Сообщение от Crait Посмотреть сообщение
AES_Windowed
AES тут зачем ?
0
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 32
17.12.2012, 21:26  [ТС] 29
Все исправил. Проблема мелкая совсем оказалась: обращение к 64 элементу массива T.
0
17.12.2012, 21:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.12.2012, 21:26
Помогаю со студенческими работами здесь

Запуск средства восстановления Windows 7. Не работает мышь. Не работает виндовс
Виндовс не запускается, нельзя воспользоваться средством восстановления и попасть в безопасный...

Модем не работает на виндовс но на убунту всё работает
Всем форумчанинам доброго времени суток!Я и раньше обращялся по поводу модема.Дела втом что модем...

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

Как называется функция на виндовс калькуляторе In(x)?
пишу код калькулятора на С++ Builder 6.0 #include &lt;math.h&gt; void __fastcall...


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru