| 
			| 
					
						| kiv 
								Участник    Offline | 
								|  | «  : 26-01-2009 16:39 »  |  | 
 
 может кто объяснит мне алгоритм инеративного кода, не совсем понимаю. Сформировать сообщение, состоящее из 16 символов, каждый символ сообщения представляется 8 битами.Представить сообщение в виде битового массива {ai}....Осуществить кодирование зашифрованного сообщения путем разбиения его на сегменты по 16 бит и последующего кодирования элементарных сегментов итеративным кодом.
 
 Примечание: Кодирование сообщения Х из 4 бит итеративным кодом осуществляется путем записи его в виде квадрата:
 X0   X1   X2   X3  | A1
 X4   X5   X6   X7  | A2
 X8   X9   X10  X11 | A3
 X12  X13  X14  X15 | A4
 -  - -- - -- - - - -
 Z1   Z2   Z3   Z4  |
 
 и добавлению символов Ai, представляющих собой сумму элементов по i-ой строке по модулю 2, и символов Zj, представляющих собой сумму элементов по j-му столбцу по модулю 2.
 
 начальное сообщение сделала одномерным массивом, есть ли смысл его переделывать в двумерный 4*32?( хотя как это сделать незнаю.)))) правильно я понимаю, что нужно сложить все элементы А1 и Z1, а потом их между собой, в итоге из 16 бит получится 4....а декодирование     Операция декодирования осуществляется следующим образом. Сегмент информационного массива на выходе канала связи длиной 24 бита расположить в форме массива, используемого при операции кодирования. Сформировать массивы Ai и Zj. Если Zi = 1 и Aj = 1, тогда элемент, находящийся на пересечении j-ой строки и i-го столбца инвертируется.
 
 как че формировать черт знает...почему 24 бита, а не 32(128 всего бит/16 в таблице =8 раз кодируем, в результате получаем 4 бита: 8*4=32 ) |  
						| 
								|  |  
								|  |  Записан | 
 
 сам задал вопрос, сам и ответил.... |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #1 : 27-01-2009 05:22 »  |  | 
 
 не совсем понятно, что имеется в виду под "и добавлению символов Ai, .... и символов Zj" - что куда и как добавляется ? или делается просто 0x1234 - > AiZi (1 байт ? ) никаких массивов переделывать тут не нужно - всё на лету делается //вспомогательная структура для "разбора" битов
 struct s_AZ_bits
 {
 union
 {
 WORD wnum;
 
 struct
 {
 WORD A1 : 4;
 WORD A2 : 4;
 WORD A3 : 4;
 WORD A4 : 4;
 };
 
 struct
 {
 WORD Z1_0 : 1;
 WORD Z2_0 : 1;
 WORD Z3_0 : 1;
 WORD Z4_0 : 1;
 WORD Z1_1 : 1;
 WORD Z2_1 : 1;
 WORD Z3_1 : 1;
 WORD Z4_1 : 1;
 WORD Z1_2 : 1;
 WORD Z2_2 : 1;
 WORD Z3_2 : 1;
 WORD Z4_2 : 1;
 WORD Z1_3 : 1;
 WORD Z2_3 : 1;
 WORD Z3_3 : 1;
 WORD Z4_3 : 1;
 };
 };
 
 inline BYTE GetA1(){return A1;}
 inline BYTE GetA2(){return A2;}
 inline BYTE GetA3(){return A3;}
 inline BYTE GetA4(){return A4;}
 inline BYTE GetZ1(){return (Z1_0|(Z1_1<<1)|(Z1_2<<2)|(Z1_3<<3));}
 inline BYTE GetZ2(){return (Z2_0|(Z2_1<<1)|(Z2_2<<2)|(Z2_3<<3));}
 inline BYTE GetZ3(){return (Z3_0|(Z3_1<<1)|(Z3_2<<2)|(Z3_3<<3));}
 inline BYTE GetZ4(){return (Z4_0|(Z4_1<<1)|(Z4_2<<2)|(Z4_3<<3));}
 };
 
 BYTE message[16]={0};
 DWORD dwdLen=sizeof(message);
 
 s_AZ_bits bits;
 
 for(DWORD i=0; i+1<dwdLen; i+=2)
 {
 bits.wnum=*(WORD*)&message[i];
 
 //тут что надо делаешь с числами A и Z
 ...=bits.GetA1();
 ...=bits.GetA2();
 ...=bits.GetA3();
 ...=bits.GetA4();
 ...=bits.GetZ1();
 ...=bits.GetZ2();
 ...=bits.GetZ3();
 ...=bits.GetZ4();
 }
 
 |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| Sla | 
								|  | « Ответ #2 : 27-01-2009 07:23 »  |  | 
 
 все элементарнопервые четыре бита складываются по модулю 2  получаем А1
 следующие четыре - А2
 таким образом получаем четыре контрольных бита А(i)
 
 каждый четвертый бит суммируется по модулю 2 получаем биты Z(j)
 таким образом:
 16 бит информационных + 4 проверочных А(i) + 4 проверочных Z(j)
 |  
						| 
								|  |  
								|  |  Записан | 
 
 Мы все учились понемногу... Чему-нибудь и как-нибудь. |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #3 : 27-01-2009 07:39 »  |  | 
 
 тогда структура разбора перепишем так struct s_AZ_bits{
 union
 {
 WORD wnum;
 
 struct
 {
 WORD A1_0 : 1;
 WORD A2_1 : 1;
 WORD A3_2 : 1;
 WORD A4_3 : 1;
 WORD A1_0 : 1;
 WORD A2_1 : 1;
 WORD A3_2 : 1;
 WORD A4_3 : 1;
 WORD A1_0 : 1;
 WORD A2_1 : 1;
 WORD A3_2 : 1;
 WORD A4_3 : 1;
 WORD A1_0 : 1;
 WORD A2_1 : 1;
 WORD A3_2 : 1;
 WORD A4_3 : 1;
 };
 
 struct
 {
 WORD Z1_0 : 1;
 WORD Z2_0 : 1;
 WORD Z3_0 : 1;
 WORD Z4_0 : 1;
 WORD Z1_1 : 1;
 WORD Z2_1 : 1;
 WORD Z3_1 : 1;
 WORD Z4_1 : 1;
 WORD Z1_2 : 1;
 WORD Z2_2 : 1;
 WORD Z3_2 : 1;
 WORD Z4_2 : 1;
 WORD Z1_3 : 1;
 WORD Z2_3 : 1;
 WORD Z3_3 : 1;
 WORD Z4_3 : 1;
 };
 };
 
 inline BYTE GetA1(){return (A1_0 + A1_1 + A1_2 + A1_3)&1;}
 inline BYTE GetA2(){return (A2_0 + A1_2 + A2_2 + A2_3)&1;}
 inline BYTE GetA3(){return (A3_0 + A1_3 + A3_2 + A3_3)&1;}
 inline BYTE GetA4(){return (A4_0 + A1_4 + A4_2 + A4_3)&1;}
 inline BYTE GetZ1(){return (Z1_0 + Z1_1 + Z1_2 + Z1_3)&1;}
 inline BYTE GetZ2(){return (Z2_0 + Z1_2 + Z2_2 + Z2_3)&1;}
 inline BYTE GetZ3(){return (Z3_0 + Z1_3 + Z3_2 + Z3_3)&1;}
 inline BYTE GetZ4(){return (Z4_0 + Z1_4 + Z4_2 + Z4_3)&1;}
 };
 
 
 |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| kiv 
								Участник    Offline | 
								|  | « Ответ #4 : 27-01-2009 18:19 »  |  | 
 
 (A1_0 + A1_1 + A1_2 + A1_3)&1; - почему?разве не так по модулю 2:
 A1_0 ^ A1_1^ A1_2 ^ A1_3
 
 |  
						| 
								|  |  
								|  |  Записан | 
 
 сам задал вопрос, сам и ответил.... |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #5 : 27-01-2009 18:26 »  |  | 
 
 надо же сложение по модулю 2, а не побитовое умножение |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| kiv 
								Участник    Offline | 
								|  | « Ответ #6 : 27-01-2009 18:30 »  |  | 
 
 |  
						| 
								|  |  
								|  |  Записан | 
 
 сам задал вопрос, сам и ответил.... |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #7 : 27-01-2009 18:37 »  |  | 
 
 ну а что не так то ?   |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| Вад | 
								|  | « Ответ #8 : 27-01-2009 18:48 »  |  | 
 
 надо же сложение по модулю 2, а не побитовое умножение
 А где тут умножение? Умножение - это & (1&1 = 1, в остальных случаях 0). ^ - это как раз эквивалент сложения по модулю 2: (1^1)=(0^0)=0;  (1^0)=(0^1)=1 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #9 : 27-01-2009 19:01 »  |  | 
 
 Вад,  Сложение по модулю 2 (исключа́ющее «ИЛИ», XOR, «сумма по модулю 2») 
 ксор работает так: 0 xor 0 == 0 1 xor 0 == 1 0 xor 1 == 1 1 xor 1 == 0 0 xor 0 xor 0 == 0 0 xor 0 xor 1 == 1 0 xor 1 xor 0 == 1 0 xor 1 xor 1 == 0 1 xor 0 xor 0 == 1 1 xor 0 xor 1 == 0 1 xor 1 xor 0 == 0 1 xor 1 xor 1 == 1 то есть, это будет всё равно, что сложить арифметически все значения и взять младший бит результата |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| Вад | 
								|  | « Ответ #10 :  27-01-2009 19:04 »   |  | 
 
 Алексей1153++, именно это я и хотел сказать   |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #11 : 27-01-2009 19:10 »  |  | 
 
 Вад, ну, считаем, что убедили Вику ))) |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| kiv 
								Участник    Offline | 
								|  | « Ответ #12 : 30-01-2009 18:05 »  |  | 
 
 че я не так сделала? не правильно считает... int q,x;unsigned char a[24]={0},z[24]={0};
 for(i=0;i<128;i+=16)
 {  for( x=0;x<16;x+=4)
 {  for( q=0;q<4;q++) {
 a[q] = bits[x]^bits[x+1]^bits[x+2]^bits[x+3];
 z[q]= bits[q]^bits[q+4]^bits[q+8]^bits[q+12];
 
 }
 
 }
 
 }
 for(x=0;x<24;x++)
 {   cout<<(int)a[x]<<" ";
 }
 cout<<endl;
 for(x=0;x<24;x++)
 {   cout<<(int)z[x]<<" ";
 }
 cout<<endl;
 
 |  
						| 
								|  |  
								|  |  Записан | 
 
 сам задал вопрос, сам и ответил.... |  |  | 
	| 
			| 
					
						| Вад | 
								|  | « Ответ #13 : 30-01-2009 18:09 »  |  | 
 
 for(x=0;x<24;x++){   cout<<(int)a[x]<<" ";
 }
 cout<<endl;
 for(x=0;x<24;x++)
 {   cout<<(int)z[x]<<" ";
 }
 cout<<endl;
 
это ещё почему 24? вроде, a и z имеют размерность 4. И смысл цикла for( x=0;x<16;x+=4) объясни заодно |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| kiv 
								Участник    Offline | 
								|  | « Ответ #14 : 30-01-2009 18:19 »  |  | 
 
 ну так это 4 у одной таблицы из 16 битов, а таких 8 получится, ведь в сообщении 16 символов, ну там не 24 по идеи, а 32...ну смысл- берем блок из 16 бит, потом в нем из 4х...а как без него? |  
						| 
								|  |  
								|  |  Записан | 
 
 сам задал вопрос, сам и ответил.... |  |  | 
	| 
			| 
					
						| Вад | 
								|  | « Ответ #15 : 30-01-2009 18:27 »  |  | 
 
 А зачем считать все таблицы сразу? Одной же хватит. У а и z по 4 элемента - так в схеме нарисовано. Считаешь a1..a4, z1..z4. Потом прибавляешь к элементам X0..x15 то и другое, согласно инструкции. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| kiv 
								Участник    Offline | 
								|  | « Ответ #16 : 30-01-2009 18:54 »  |  | 
 
 вроде сделала..... for(k=0;k<128;k+=16)for(int i=0;i<4;++i)
 {
 a[i]=0;
 z[i]=0;
 
 for(int j=0;j<4;++j)
 {
 a[i]^=bits2[k+i*4+j];
 z[i]^=bits2[k+j*4+i];
 }
 }
 
как теперь это прибавить к тому что есть.... |  
						| 
								|  |  
								| « Последнее редактирование: 30-01-2009 19:00 от kiv » |  Записан | 
 
 сам задал вопрос, сам и ответил.... |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #17 : 31-01-2009 07:14 »  |  | 
 
 Offtopic: я не совсем уловил - это уже какое то другое задание началось ? )
 
 Поставлю в угол. |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| Вад | 
								|  | « Ответ #18 : 31-01-2009 07:21 »  |  | 
 
 Алексей1153++, да нет, как будто. Это подсчёт A и Z для таблицы   kiv , Ну так берёшь на вход блок из 16 бит. Вычисляешь A и Z, затем складываешь символы с A[i] и Z[j], как положено, и записываешь в результирующий блок. Я только не понял, нужно ли в результат записывать 8 бит из A и Z (в конец блока). |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #19 : 31-01-2009 07:36 »  |  | 
 
 а зачем тогда столько мучений, когда структура битовых полей для разбора битов куда удобнее и быстрее работает ? )
 если сложение сильно не устраивает, то так
 
 inline BYTE GetA1(){return A1_0^A1_1^A1_2^A1_3;}
 |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| kiv 
								Участник    Offline | 
								|  | « Ответ #20 : 06-02-2009 15:28 »  |  | 
 
 как эту фигню раскодировать? массив mas[24*8], в нем сначала 16 бит сообщения, потом а1,z1, a2, z2... записаны.
 |  
						| 
								|  |  
								|  |  Записан | 
 
 сам задал вопрос, сам и ответил.... |  |  | 
	| 
			| 
					
						| Sla | 
								|  | « Ответ #21 : 06-02-2009 15:48 »  |  | 
 
 а зачем?они не закодированы, они защищены.
 |  
						| 
								|  |  
								|  |  Записан | 
 
 Мы все учились понемногу... Чему-нибудь и как-нибудь. |  |  | 
	| 
			| 
					
						| kiv 
								Участник    Offline | 
								|  | « Ответ #22 : 06-02-2009 15:58 »  |  | 
 
 в смысле? задание такое... |  
						| 
								|  |  
								|  |  Записан | 
 
 сам задал вопрос, сам и ответил.... |  |  | 
	| 
			| 
					
						| Вад | 
								|  | « Ответ #23 : 06-02-2009 20:15 »  |  | 
 
 kiv, надо полагать, нужно опять прибавить к элементу ai и zj.  |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  |