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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 59, средняя оценка - 4.93
DiffON
0 / 0 / 0
Регистрация: 15.09.2012
Сообщений: 6
#1

Как сравнить два массива - C++

24.09.2012, 19:17. Просмотров 8064. Ответов 7
Метки нет (Все метки)

Здравствуйте форумчане!
Помогите пожалуйста, скажите как сравнить два массива побитово и побайтово.
В инете ни чего не могу найти((
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.09.2012, 19:17     Как сравнить два массива
Посмотрите здесь:

C++ Сравнить логически два массива
C++ Сравнить два массива, заданных классами
C++ Как сравнить два символа?
Сравнить два массива и запомнить номер первых двух совпавших элементов C++
C++ Даны два массива. Найти среднее арифметическое элементов каждого и сравнить эти значения
Как сравнить два слова C++
Сравнить два массива одинаковой длины C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3585 / 1365 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
24.09.2012, 19:28     Как сравнить два массива #2
Побайтово, значит представить ваш массив, как массив char
Побитово, значит использовать для сравнения каждого бита в байтах маски.
DiffON
0 / 0 / 0
Регистрация: 15.09.2012
Сообщений: 6
24.09.2012, 19:57  [ТС]     Как сравнить два массива #3
Цитата Сообщение от go Посмотреть сообщение
Побайтово, значит представить ваш массив, как массив char
Побитово, значит использовать для сравнения каждого бита в байтах маски.
А можно пример какой нибудь если не сложно??

Добавлено через 17 минут
А можно пример какой нибудь если не сложно??
Thinker
Эксперт C++
4219 / 2193 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
24.09.2012, 20:02     Как сравнить два массива #4
Цитата Сообщение от DiffON Посмотреть сообщение
А можно пример какой нибудь если не сложно??
например, посмотрите на работу функции strcmp(), ее лексикографическре сравнение массивов символов. Вы также можете сравнить два массива лексикографически
DiffON
0 / 0 / 0
Регистрация: 15.09.2012
Сообщений: 6
24.09.2012, 20:03  [ТС]     Как сравнить два массива #5
Цитата Сообщение от Thinker Посмотреть сообщение
например, посмотрите на работу функции strcmp(), ее лексикографическре сравнение массивов символов. Вы также можете сравнить два массива лексикографически
Спасибо большое вроде нашел!!!
Петррр
5934 / 3371 / 334
Регистрация: 28.10.2010
Сообщений: 5,926
24.09.2012, 20:04     Как сравнить два массива #6
А какого типа изначально массив? И какова цель сравнения?
go
Эксперт C++
3585 / 1365 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
24.09.2012, 20:06     Как сравнить два массива #7
DiffON,
Цитата Сообщение от go Посмотреть сообщение
Побайтово, значит представить ваш массив, как массив char
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <string.h>
 
int arrcmp(char*, char*, size_t, size_t);
 
int main(void)
{
   int arr1[] = { 1, 2, 3, 4, 5 };
   int arr2[] = { 1, 2, 3 };
  
   printf("%d\n%d\n%d\n",
      arrcmp((char *)arr1, (char *)arr2, sizeof arr1, sizeof arr2),
      arrcmp((char *)arr1, (char *)arr1, sizeof arr1, sizeof arr1),
      arrcmp((char *)arr2, (char *)arr1, sizeof arr2, sizeof arr1)  
   );
}   
   
int arrcmp(char *s1, char *s2, size_t size1, size_t size2)
{
   size_t *size = size1 > size2 ? &size2 : &size1;
   return (strncmp(s1, s2, *size) == 0 && size1 != size2) ? (size1 > size2 ?  1 : -1) : strncmp(s1, s2, *size);
}
http://liveworkspace.org/code/f88663...cb309f0e8546e6
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2012, 22:05     Как сравнить два массива
Еще ссылки по теме:

C++ Найти среднее арифметическое элементов массива, сравнить два массива поэлементно
C++ Сравнить поэлементно два одномерных массива, и через if определить, равны эти элементы или нет
C++ Как сравнить два элемента массива типа string?
Заданы два массива целых чисел одинаковой размерности. Сравнить их соответствующие элементы и вывести C++
Сравнить два массива C++

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

Или воспользуйтесь поиском по форуму:
DiffON
0 / 0 / 0
Регистрация: 15.09.2012
Сообщений: 6
24.09.2012, 22:05  [ТС]     Как сравнить два массива #8
Цитата Сообщение от Петррр Посмотреть сообщение
А какого типа изначально массив? И какова цель сравнения?
В общем ситуация такая, нужно зашифровать массив с данными по ГОСТ 28147-89 в режиме простой замены, это я сделал, после нужно его сравнить с эталоном, а эталоном является точно такие же данные как и в массиве но зашифрованные с помощью сторонней 100% рабочей программой(например Tantal или Шифровальщик3)... т.е.исходом кода должно быть сравнение выходных зашифрованных данных с помощью моего кода с зашифрованными данными сторонней программы...

Добавлено через 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
178
179
180
181
182
183
184
185
#define SEKRETKEY       "98765432109876543210987654321098"
 
#define CRYPT           0
#define DECRYPT         1
 
 
 
int reverse_bit(int X)
{
    return
    X =                            
        ((X & 0x1)          <<31)+((X & 0x2)        <<29)+((X & 0x4)        <<27)+((X & 0x8)        <<25)+
        ((X & 0x10)         <<23)+((X & 0x20)       <<21)+((X & 0x40)       <<19)+((X & 0x80)       <<17)+
        ((X & 0x100)        <<15)+((X & 0x200)      <<13)+((X & 0x400)      <<11)+((X & 0x800)      << 9)+
        ((X & 0x1000)       << 7)+((X & 0x2000)     << 5)+((X & 0x4000)     << 3)+((X & 0x8000)     << 1)+
        ((X & 0x10000)      >> 1)+((X & 0x20000)    >> 3)+((X & 0x40000)    >> 5)+((X & 0x80000)    >> 7)+
        ((X & 0x100000)     >> 9)+((X & 0x200000)   >>11)+((X & 0x400000)   >>13)+((X & 0x800000)   >>15)+
        ((X & 0x1000000)    >>17)+((X & 0x2000000)  >>19)+((X & 0x4000000)  >>21)+((X & 0x8000000)  >>23)+
        ((X & 0x10000000)   >>25)+((X & 0x20000000) >>27)+((X & 0x40000000) >>29)+((X & 0x80000000) >>31);
}
 
int reverse_block(int X)
{
    return
    X =                           
        ((X & 0x1)          << 7)+((X & 0x2)        << 5)+((X & 0x4)        << 3)+((X & 0x8)        << 1)+
        ((X & 0x10)         >> 1)+((X & 0x20)       >> 3)+((X & 0x40)       >> 5)+((X & 0x80)       >> 7)+
        ((X & 0x100)        << 7)+((X & 0x200)      << 5)+((X & 0x400)      << 3)+((X & 0x800)      << 1)+
        ((X & 0x1000)       >> 1)+((X & 0x2000)     >> 3)+((X & 0x4000)     >> 5)+((X & 0x8000)     >> 7)+
        ((X & 0x10000)      << 7)+((X & 0x20000)    << 5)+((X & 0x40000)    << 3)+((X & 0x80000)    << 1)+
        ((X & 0x100000)     >> 1)+((X & 0x200000)   >> 3)+((X & 0x400000)   >> 5)+((X & 0x800000)   >> 7)+
        ((X & 0x1000000)    << 7)+((X & 0x2000000)  << 5)+((X & 0x4000000)  << 3)+((X & 0x8000000)  << 1)+
        ((X & 0x10000000)   >> 1)+((X & 0x20000000) >> 3)+((X & 0x40000000) >> 5)+((X & 0x80000000) >> 7);
}
 
void GOST(short mode, unsigned int MA[], unsigned int OUT[] )
{
int size = 4;
 //unsigned int  MA [4]={234,3434,3343,345};
//  unsigned int  OUT [4]={0};
  unsigned int Fragments[8];
  int i;
  int k;
  unsigned int T; 
  int j;                
 
 
    unsigned int Sbox[8][16] = 
    {
        {4,10,9,2,13,8,0,14,6,11,1,12,7,15,5,3},
        {14,11,4,12,6,13,15,10,2,3,8,1,0,7,5,9},
        {5,8,1,13,10,3,4,2,14,15,12,7,6,0,9,11},
        {7,13,10,1,0,8,9,15,14,4,6,12,11,2,5,3},
        {6,12,7,1,5,15,13,8,4,10,9,14,0,3,11,2},
        {4,11,10,0,7,2,1,13,3,6,8,5,9,12,15,14},
        {13,11,4,1,3,15,5,9,0,10,14,7,6,8,2,12},
        {1,15,13,0,5,7,10,4,9,2,3,14,6,11,8,12}
    };
 
    
    char s[33] = SEKRETKEY;
    unsigned int key[8];
 
 
    for( i= 0; i<8; i++)
    {
        key[i] = (s[4*i]<<24) + (s[1+4*i]<<16) + (s[2+4*i]<<8) + s[3+4*i];  
 
        key[i] = reverse_bit(key[i]);       
    }
 
    
    for (k=0;k<size;k++)
    {
        unsigned int A = 0;                 
        unsigned int B = 0;                
 
 
        A = MA[k];
 
        B = MA[k+1];
        
        A = reverse_block(A);           
        B = reverse_block(B);           
        
        
        
        for(i = 0; i<32; i++)
        {
            T = 0;                  
            if(mode == CRYPT)
            {
                if(i<24) T = (A+key[i%8]) % 0x100000000;    
                else T = (A+key[7-(i%8)]) % 0x100000000;
            }
            if(mode == DECRYPT)
            {
                if(i<8) T = (A+key[i%8])  % 0x100000000;    
                else T = (A+key[7-(i%8)]) % 0x100000000;
            }
 
            Fragments[0] = (T & 0xF0000000)>>28 ;
           Fragments[1] = (T & 0xF000000)>>24;
           Fragments[2] = (T & 0xF00000)>>20    ;
           Fragments[3] =  (T & 0xF0000)>>16,
           Fragments[4] = (T & 0xF000)>>12  ;
           Fragments[5] =(T & 0xF00)>> 8    ;
           Fragments[6] =  (T & 0xF0)>> 4;
            Fragments[7] =   (T & 0xF);
 
 
 
 
            for(j = 0; j<8; j++)
            {
                Fragments[j] = Sbox[j][Fragments[j]];     
            }
 
            T = (Fragments[0]<<28) +        
                (Fragments[1]<<24) +
                (Fragments[2]<<20) +
                (Fragments[3]<<16) +
                (Fragments[4]<<12) +
                (Fragments[5]<< 8) +
                (Fragments[6]<< 4) +
                 Fragments[7];
 
            T = (T<<11)|(T>>21);            
            T ^= B;                         
 
            if(i != 31)
            {
                B = A;                     
                A = T;
            }
            else
            {
                B = T;
            }
        }   
 
        A = reverse_block(A);           
        B = reverse_block(B);           
 
        OUT[k] = A;
        OUT[k+1] = B;
        k=k+1;
        
    }   
    
}
 
 
int main()
{
unsigned int ORIG[4]={123,12312,3123,213};
unsigned int ZASHIFR[4];
unsigned int ITOG[4];
int i;
short FlgCompare = 1;
 
   GOST(CRYPT,ORIG,ZASHIFR);
   GOST(DECRYPT,ZASHIFR,ITOG);
 
   FlgCompare = 1;
 
   for (i=0;i<4;i++)
   {
        if(ORIG[i]!=ITOG[i])
        {
            FlgCompare =0 ;
            break;
        }
   }
 
   if (FlgCompare)
   {
     //Норм
   }
   else
   {
     // Косяк
   }
   return 0;
}
Добавлено через 6 минут
Цитата Сообщение от DiffON Посмотреть сообщение
int main()
{
unsigned int ORIG[4]={123,12312,3123,213};
unsigned int ZASHIFR[4];
unsigned int ITOG[4];
int i;
short FlgCompare = 1;
GOST(CRYPT,ORIG,ZASHIFR);
* *GOST(DECRYPT,ZASHIFR,ITOG);
FlgCompare = 1;
for (i=0;i<4;i++)
* *{
* * * * if(ORIG[i]!=ITOG[i])
* * * * {
* * * * * * FlgCompare =0 ;
* * * * * * break;
* * * * }
* *}
вот так вот можно было сравнить побайтово???
Yandex
Объявления
24.09.2012, 22:05     Как сравнить два массива
Ответ Создать тему
Опции темы

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