Laboratorium telekomunikacji Zadanie 2

Podobne dokumenty
Wykład VI. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Programowanie w językach

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

Lab 8. Tablice liczbowe cd,. Operacje macierzowo-wektorowe, memcpy, memmove, memset. Wyrażenie warunkowe.

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

Języki i paradygmaty programowania 1 studia stacjonarne 2018/19. Lab 9. Tablice liczbowe cd,. Operacje na tablicach o dwóch indeksach.

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.

Biblioteka standardowa - operacje wejścia/wyjścia

Wprowadzenie do programowania i programowanie obiektowe

Informatyka. Wy-03 Dynamiczna alokacja pamięci, wyjątki. mgr inż. Krzysztof Kołodziejczyk

Programowanie proceduralne INP001210WL rok akademicki 2015/16 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Język ludzki kod maszynowy

Ghost in the machine

Wskaźniki do funkcji. Wykład 11. Podstawy programowania ( język C ) Wskaźniki do funkcji (1) Wskaźniki do funkcji (2)

Programowanie współbieżne Zadanie 5 - Podstawowe problemy programowania współbieżnego

Podstawy Programowania C++

Program wykonujący operację na plikach powinien zachować schemat działania zapewniający poprawną pracę:

Sieciowa komunikacja procesów - XDR i RPC

Functionalization. Jeszcze o funkcjach i strukturze projektu. Marcin Makowski. 3 grudnia Zak lad Chemii Teoretycznej UJ

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

Podstawy programowania w Pythonie

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Pliki. Informacje ogólne. Obsługa plików w języku C

Podstawy programowania w języku C++

1 Podstawy c++ w pigułce.

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

Obsługa plików. Systemy Operacyjne 2 laboratorium. Mateusz Hołenko. 25 września 2011

PRZYKŁADY OPERACJI PLIKOWYCH z wykorzystaniem biblioteki <stdio.h>

Funkcje zawarte w bibliotece < io.h >

Laboratorium 1. Programowanie II - Kierunek Informatyka. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej

Pliki. Informacje ogólne. Obsługa plików w języku C

Wstęp do Programowania, laboratorium 02

Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013

Zad. 3: Układ równań liniowych

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

۰ Elementem jednostkowym takiego pliku jest bajt. ۰ Format pliku binarnego: [bajty pliku][eof]

Funkcje zawarte w bibliotece < io.h >

Język Python (2) Język Python (2) 1/36

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

Argumenty wywołania programu, operacje na plikach

Formatowane (tekstowe) wejście/wyjście. Binarne wejście/wyjście.

Politechnika Łódzka. Instytut Systemów Inżynierii Elektrycznej. Laboratorium cyfrowej techniki pomiarowej. Ćwiczenie 4

int tab[5]; tab[1]; ciągły obszar pamięci, w którym umieszczone są elementy tego samego typu macierz [ ] - dwuargumentowy operator indeksowania

Programowanie w językach wysokiego poziomu

Typy wyliczeniowe Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Podstawy Kompilatorów

1 Podstawy c++ w pigułce.

Część 4 życie programu

DYNAMICZNE PRZYDZIELANIE PAMIECI

Laboratorium podstaw elektroniki

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Laboratorium 1. I. Zainstaluj program Eclipse (wersja C/C++ w odpowiednim systemie operacyjnym

Wykład I. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Podstawy programowania w języku C++

Informatyka I. Wykład 3. Sterowanie wykonaniem programu. Instrukcje warunkowe Instrukcje pętli. Dr inż. Andrzej Czerepicki

Inż. Kamil Kujawski Inż. Krzysztof Krefta. Wykład w ramach zajęć Akademia ETI

Ćwiczenie 1. Wprowadzenie do programu Octave

I znowu można jak w C, za pomocą starych struktur i metod:

4. Tablica dwuwymiarowa to jednowymiarowa tablica wskaźników do jednowymiarowych tablic danego typu.

Wskaźniki. Pamięć dynamiczna

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

I - Microsoft Visual Studio C++

Języki i metodyka programowania. Wprowadzenie do języka C

Wskaźniki. Pamięć dynamiczna

Szablony funkcji i szablony klas

PARADYGMATY PROGRAMOWANIA Wykład 3

INFORMATYKA Studia Niestacjonarne Elektrotechnika

Laboratorium podstaw elektroniki

Podstawy Kompilatorów

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Języki i paradygmaty programowania 1 studia niestacjonarne 2018/19

Wprowadzenie do Valgrinda

ISO/ANSI C dostęp do plików ISO/ANSI C. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików

Politechnika Gdańska Wydział Elektrotechniki i Automatyki Katedra Inżynierii Systemów Sterowania

Pobieranie argumentów wiersza polecenia

Ćwiczenie 1. Wprowadzenie do programu Octave

Technologie cyfrowe semestr letni 2018/2019

Technologie cyfrowe semestr letni 2018/2019

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Podstawy i języki programowania

wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury,

Podstawy algorytmiki i programowania - wykład 2 Tablice dwuwymiarowe cd Funkcje rekurencyjne

Laboratorium Systemów Operacyjnych. Ćwiczenie 4. Operacje na plikach

Uzupełnienie dot. przekazywania argumentów

W języku C każdy plik fizyczny jest ciągiem bajtów, z których każdy może być niezależnie odczytany. Borland 01234

Tekst oblewający literę. Tekst oblewający literę. Tekst oblewający. Pakiety wrapfig i listings. 1. Pakiet wrapfig. 21 marca 2015

Kurs języka Python Wykład 6. Pliki tekstowe Pliki rekordów Pliki CSV Strumienie

Klasa iostream... 1 Klasy ofstream, ifstream Struktura FILE... 8

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Wykresy i interfejsy użytkownika

Transkrypt:

150875 Grzegorz Graczyk numer indeksu imi i nazwisko 151021 Paweł Tarasiuk numer indeksu imi i nazwisko Data 2010-03-03 Kierunek Informatyka Rok akademicki 2009/10 Semestr 4 Grupa dziekańska 2 Laboratorium telekomunikacji Zadanie 2

Opis programu i naszego rozumowania Przygotowane zostały dwa programy, których używaliśmy do rozwiązania problemu. Pierwszy z nich - napisany w języku Python - został wykorzystany do dogłębnej analizy problemu i wykonuje założenia instrukcji do ćwiczenia bardzo dokładnie, trzymając się semantyki postawionego problemu. Wyróżnione zostały np. funkcje przekształcające dane z pliku do postaci wektorów macierzy wartości logicznych, oraz funkcje przeznaczone do mnożenia macierzy. Program ten zawiera także funkcje badające zgodność wykorzystywanych macierzy z założeniami, oraz możliwość brutalnego szukania spełniającej wymagania macierzy o podanych wymiarach. Brutalne poszukiwania (sprawdzenie ponad pięciu milionów przypadków) utwierdziły nas w przekonaniu, że najmniejsza macierz H, która może pozwolić na korektę dwóch błędów w ośmiobitowej macierzy musi mieć dziewięć wierszy (a zatem minimalna liczba bitów kontrolnych to właśnie 9). Dużo prościej jest dla korekty jednego błędu - potrafimy oszacować od dołu, że liczba bitów kontrolnych musi wynosić co najmniej 4, i faktycznie dla 4 bitów udało nam się skonstruować poprawną macierz. Oszacowanie wynika z tego, że macierz H dla korekty jednego błędu musi posiadać n + 8 różnych, niezerowych kolumn, podczas gdy możliwych wariacji które mogą być kolumnami jest tylko 2 n 1. Uzyskany warunek n + 8 2 n 1 jest natomiast spełniony dla n > 3. Zatem przykładowe macierze, których można używać do tworzenia bitów kontrolnych oraz do korekty błędów, mają postać: H 1 = Dla korekty jednego błędu, oraz: H 2 = Dla korekty dwóch błędów. 1 1 1 0 0 0 1 1 1 0 0 0 1 0 0 1 1 0 1 1 0 1 0 0 0 1 0 1 0 1 1 0 0 0 1 0 0 0 1 0 1 1 0 1 0 0 0 1 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1 1 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1 1 1 0 0 0 0 0 1 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 Druga z przygotowanych implementacji cechuje się wysoką wydajnością, jednakże jest pisana w specyficznym dialekcie języka C, specyficznym dla kompilatora GNU. Jednakże kompilator gcc pozwala na korzystanie z niego na wielu platformach sprzętowych z systemami uniksopobobnymi. Implementacja ta jest szybka i oszczędna pamięciowo, lecz jej wadami są: mniejsza przenośność, gorsza czytelność i pewne zmiany w rozumowaniu w stosunku do instrukcji. Jednakże wynik działania drugiego programu jest w pełni zgodny z oczekiwaniami i obie implementacje są wzajemnie kompatybilne. Implementacja przenośna, ściśle zgodna z opisem, wykonana w języku Python #! / usr / bin / env python import s y s Telekomunikacja: Grzegorz Graczyk i Paweł Tarasiuk 2 / 11

import random # # Agumenty programu : # 1 lub 2 tryb pracy ( przygotowanie do k o r e k c j i 1 b i t u na 12 lub 2 bitow na 17) # enc lub dec przygotowanie lub odczyt # p l i k wejsciowy # p l i k wyjsciowy # # macierz do korekty jednego bledu przy 8 b i t a c h danych 4 b i t y k o n t r o l n e H1 = [ [ 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0 ], [ 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0 ], [ 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0 ], [ 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1 ] ] # macierz do korekty dwoch bledow przy 8 b i t a c h danych 9 bitow kontrolnych H2 = [ [ 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ], [ 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 ], [ 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 ], [ 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0 ], [ 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 ], [ 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0 ], [ 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ] ] # sprawdza poprawnosc macierzy H s l u z a c e j do naprawy jednego bledu # i i n f o r m u j e o ewentualnych bledach w macierzy d e f m a t r i x t e s t 1 (H, q u i e t = F a l s e ) : HT = t r a n s p o n a t e (H) HT. append ( [ ] ) f o r i i n xrange ( l e n (HT [ 0 ] ) ) : HT[ 1 ]. append ( 0 ) h = l e n (HT) f o r i i n xrange ( h ) : f o r j i n xrange ( i ) : i f HT[ i ] == HT[ j ] : i f not q u i e t : p r i n t Columns %d and %d are equal. % ( i, j ) r e t u r n True # sprawdza poprawnosc macierzy H s l u z a c e j do naprawy dwoch bledow # i i n f o r m u j e o ewentualnych bledach w macierzy d e f m a t r i x t e s t 2 (H, q u i e t = F a l s e ) : HT = t r a n s p o n a t e (H) HT. append ( [ ] ) f o r i i n xrange ( l e n (HT [ 0 ] ) ) : HT[ 1 ]. append ( 0 ) h = l e n (HT) P = [ ] f o r i i n xrange ( h ) : f o r j i n xrange ( i ) : i f HT[ i ] == HT[ j ] : i f not q u i e t : p r i n t Columns %d and %d are equal. % ( i, j ) P. append ( [ b o o l v e c t o r x o r (HT[ i ], HT[ j ] ), i, j ] ) h = l e n (P) f o r i i n xrange ( h ) : f o r j i n xrange ( h ) : i f i!= j : i f P [ i ] [ 0 ] == P [ j ] [ 0 ] : i f not q u i e t : p r i n t ( Columns (%d, %d ) and (%d, %d ) have equal sums. Telekomunikacja: Grzegorz Graczyk i Paweł Tarasiuk 3 / 11

r e t u r n True % (P [ i ] [ 1 ], P [ i ] [ 2 ], P [ j ] [ 1 ], P [ j ] [ 2 ] ) ) # g e n e r u j e macierz, np. # matrix gen ( 4, m a t r i x t e s t 1 ) l o s u j e macierz do k o r e k c j i jednego bledu # matrix gen ( 9, m a t r i x t e s t 2 ) l o s u j e macierz do k o r e k c j i dwoch bledow # matrix gen ( 8, m a t r i x t e s t 2 ) w i e c z n i e p r a c u j e i i n f o r m u j e o l i c z b i e zbadanych przypadkow d e f matrix gen ( t, t e s t ) : U = [ ] P = [ ] s = 0 f o r i i n xrange ( t + 1 ) : U. append ( [ ] ) f o r j i n xrange ( t ) : U[ i ]. append ( 0 ) f o r i i n xrange ( 1, t + 1 ) : U[ i ] [ i 1 ] = 1 f o r i i n xrange (1 << t ) : P. append ( [ ] ) f o r j i n xrange ( t ) : P [ i ]. append ( i n t ( bool ( i & (1 << j ) ) ) ) f o r e i n U: P. remove ( e ) w h i l e True : R = [ ] f o r e i n random. sample (P, 8 ) : R. append ( e ) f o r e i n U [ 1 : ] : R. append ( e ) i f t e s t ( t r a n s p o n a t e (R), True ) : p r i n t Analyzed samples : %d % ( s + 1) p r i n t Result : [ f o r e i n t r a n s p o n a t e (R) : p r i n t e p r i n t ] r e t u r n True s += 1 i f s % 25000 == 0 : p r i n t Analyzed samples : %d % s # dodaje b i t y k o n t r o l n e do t a b l i c y bitow d e f a d d c o n t r o l (T, H) : S = T n = l e n (H) m = l e n (H[ 0 ] ) n f o r i i n xrange ( n ) : c = 0 f o r j i n xrange (m) : c ˆ= H[ i ] [ j ] & T[ j ] [ 0 ] S. append ( [ c ] ) r e t u r n S # mnozy macierze d e f boolmatrix mul (A, B ) : i f l e n (A[ 0 ] )!= l e n (B ) : R = [ ] h = l e n (A) w = l e n (B [ 0 ] ) n = l e n (B) f o r i i n xrange ( h ) : R. append ( [ ] ) f o r j i n xrange (w) : R[ i ]. append ( 0 ) f o r k i n xrange ( n ) : R[ i ] [ j ] ˆ= A[ i ] [ k ] & B[ k ] [ j ] r e t u r n R # dodaje wektory jednowymiarowe Telekomunikacja: Grzegorz Graczyk i Paweł Tarasiuk 4 / 11

d e f b o o l v e c t o r x o r (A, B ) : i f l e n (A)!= l e n (B ) : R = [ ] l = l e n (A) f o r i i n xrange ( l ) : R. append (A[ i ] ˆ B[ i ] ) r e t u r n R # t r a n s p o n u j e macierz dwuwymiarowa d e f t r a n s p o n a t e (A) : R = [ ] h = l e n (A) w = l e n (A[ 0 ] ) f o r i i n xrange (w) : R. append ( [ ] ) f o r j i n xrange ( h ) : R[ i ]. append (A[ j ] [ i ] ) r e t u r n R # wprowadza bledy do t a b l i c y bitow d e f a d d e r r o r s (V, n ) : R = V f o r r i n random. sample ( range ( l e n (V) ), n ) : R[ r ] [ 0 ] ˆ= 1 r e t u r n R # sprawdza, czy czasem macierz n i e zawiera j a k i e g o s niezerowego pola d e f i s z e r o (A) : t r y : f o r i i n xrange ( l e n (A) ) : i f not i s z e r o (A[ i ] ) : r e t u r n True except : r e t u r n not bool ( i n t (A) ) # wyszukuje element w t a b l i c y ( n i e chce nam s i e potem obslugiwac bledow # jak elementu n i e ma, chcemy wartosc 1) d e f a r r a y f i n d (A, e ) : t r y : r e t u r n A. index ( e ) except : r e t u r n 1 d e f m a k e f l a t (A) : t r y : i f l e n (A) == 1 : r e t u r n m a k e f l a t (A[ 0 ] ) e l i f l e n (A) > 1 : f o r i i n xrange ( l e n (A) ) : A[ i ] = m a k e f l a t (A[ i ] ) r e t u r n A except : r e t u r n A # u s t a l a, na j a k i c h pozycjach sa bledy d e f f i n d e r r o r s (H, E ) : M = m a k e f l a t ( boolmatrix mul (H, E) ) HT = t r a n s p o n a t e (H) i f i s z e r o (M) : r e t u r n [ ] f = a r r a y f i n d (HT, M) i f f!= 1: r e t u r n [ f ] f o r i i n xrange ( l e n (HT) ) : f = a r r a y f i n d (HT, b o o l v e c t o r x o r (M, HT[ i ] ) ) i f f!= 1: r e t u r n [ f, i ] r e t u r n [ 1] Telekomunikacja: Grzegorz Graczyk i Paweł Tarasiuk 5 / 11

# zamienia c i a g bajtow na t a b l i c e bitow o zadanej d l u g o s c i d e f b y t e s 2 a r r ( b, n ) : R = [ ] p = 0 i f b == : b = \0 w h i l e n l e n (R) > 8 : t = ord ( b [ 0 ] ) f o r i i n xrange ( 8 ) : R. i n s e r t ( p, t & 1) t >>= 1 p += 8 b = b [ 1 : ] i f b == : b = \0 t = ord ( b [ 0 ] ) w h i l e l e n (R) < n : R. i n s e r t ( p, t & 1) t >>= 1 r e t u r n R # zamienia t a b l i c e bitow na c i a g bajtow d e f a r r 2 b y t e s (A) : B = A [ : 8 ] C = A [ 8 : ] n = 0 r = w h i l e l e n (B) < 8 : B. i n s e r t ( 0, 0) w h i l e B: n = ( n << 1) + B [ 0 ] B = B [ 1 : ] r += chr ( n ) i f C: r += a r r 2 b y t e s (C) r e t u r n r # przygotowuje p l i k do t r a n s m i s j i, o p c j o n a l n i e zaszumiajac go d e f e n c o d e f i l e ( inn, outn, H, e = 0 ) : f i n = open ( inn, rb ) f o u t = open ( outn, wb ) w h i l e True : c = f i n. read ( 1 ) i f c == : break f o u t. w r i t e ( a r r 2 b y t e s ( m a k e f l a t ( a d d e r r o r s ( a d d c o n t r o l ( t r a n s p o n a t e ( [ b y t e s 2 a r r ( c, 8 ) ] ), H), random. r a n d i n t ( 0, e ) ) ) ) ) f i n. c l o s e ( ) f o u t. c l o s e ( ) # o d c z y t u j e odebrany p l i k d e f d e c o d e f i l e ( inn, outn, H, e = 1): f i n = open ( inn, rb ) f o u t = open ( outn, wb ) n = l e n (H[ 0 ] ) b = ( n + 7) >> 3 w h i l e True : c = f i n. read ( b ) i f c == : break R = t r a n s p o n a t e ( [ b y t e s 2 a r r ( c, n ) ] ) E = f i n d e r r o r s (H, R) i f l e n (E) == 1 and E [ 0 ] == 1: p r i n t Error : data not r e c o g n i z e d at a l l ( and, e s p e c i a l l y, not f i x e d )! e l i f e!= 1 and l e n (E) > e : p r i n t ( Warning : more e r r o r s than expected. Probably mistaken due to too buggy + data. ) f o r x i n E : R[ x ] [ 0 ] ˆ= 1 Telekomunikacja: Grzegorz Graczyk i Paweł Tarasiuk 6 / 11

f o u t. w r i t e ( a r r 2 b y t e s ( m a k e f l a t ( t r a n s p o n a t e (R ) ) [ : 8 ] ) ) f i n. c l o s e ( ) f o u t. c l o s e ( ) c o n f i g s = [ [ H1, m a t r i x t e s t 1, 1 ], [ H2, m a t r i x t e s t 2, 2 ] ] i f l e n ( s y s. argv )!= 5 : p r i n t Too l i t t l e arguments. p r i n t p r i n t USAGE: p r i n t %s 1 2 enc dec INFILE OUTFILE s y s. e x i t ( ) i f s y s. argv [ 1 ] == 1 : c o n f i g = c o n f i g s [ 0 ] e l i f s y s. argv [ 1 ] == 2 : c o n f i g = c o n f i g s [ 1 ] i f not c o n f i g [ 1 ] ( c o n f i g [ 0 ] ) : p r i n t E r r o r s i n b u i l t i n matrix... e x i t ( ) i f s y s. argv [ 2 ] == enc : e n c o d e f i l e ( s y s. argv [ 3 ], s y s. argv [ 4 ], c o n f i g [ 0 ], c o n f i g [ 2 ] ) e l i f s y s. argv [ 2 ] == dec : d e c o d e f i l e ( s y s. argv [ 3 ], s y s. argv [ 4 ], c o n f i g [ 0 ] ) Implementacja wydajna - w dialekcie języka C wykorzystującym specyficzne właściwości kompilatora GNU #i n c l u d e <s t d i o. h> #i n c l u d e <s t r i n g. h> #i n c l u d e <s t d l i b. h> c o n s t char usage [ ] = Usage \n. / main [ s s e c i n g s ] mode\n Modes : \ n // term t e r m i n a l c o n n e c t i o n \n // r e c v r e c i v e f i l e u s i n g xmodem\n // send send f i l e u s i n g xmodem\n cat w r i t e input to output \n // Port : \ n // e n t e r port as d e v i c e f i l e path \n S s e c i n g s : \ n i f i l e use FILE as input \n o f i l e use FILE as output \n c code encode f i l e u s i n g CODE\n codes : \n s e c S i n g l e Error C o r r e c t i o n \n s e c r S i n g l e Error C o r r e c t i o n Revert \n dec Double Error C o r r e c t i o n \n decr Double Error C o r r e c t i o n Revert \n e r r 1 Create e r r o r s f o r SEC\n e r r 2 Create e r r o r s f o r DEC\n v v e rbose mode\n ; / s s e c i n g s : / #d e f i n e bool char #d e f i n e t r u e ( ( bool ) 1 ) #d e f i n e f a l s e ( ( bool ) 0 ) t y p e d e f i n t ( coder ) ( char, int, char ) ; FILE input ; FILE output ; coder code = NULL; bool v e r b o s e = f a l s e ; / kodowanie ( zad2 ) / Telekomunikacja: Grzegorz Graczyk i Paweł Tarasiuk 7 / 11

/ Eight to Twelve / c o n s t char sec mask [ 4 ] = { 0 x0f, 0x71, 0xb6, 0xda ; i n t s e c r ( char in, i n t len, char out ) { i n t i, j, k ; unsigned char er, m; r e t u r n l e n / 2 ; f o r ( i = j = 0 ; i < l e n ; i += 2, j++) { out [ j ] = i n [ i ] ; e r = 0 x f f ; m = i n [ i + 1 ] ; f o r ( k = 0 ; e r && k < 4 ; k++, m >>= 1) { // f p r i n t f ( s t d e r r, %d ) %x %x\n, k, er, m ) ; i f ( ( b u i l t i n p o p c o u n t ( i n [ i ] & sec mask [ k ] ) & 1) == (m & 1 ) ) e r &= sec mask [ k ] ; e l s e e r &= sec mask [ k ] ; i f ( v e r b o s e ) f p r i n t f ( s t d e r r, Fixing e r r o r! \ n, k ) ; out [ j ] ˆ= e r ; r e t u r n j ; i n t s e c ( char in, i n t len, char out ) { i n t i, j, k ; r e t u r n l e n 2 ; f o r ( i = j = 0 ; i < l e n ; i ++, j += 2) { out [ j ] = i n [ i ] ; out [ j + 1 ] = 0 ; f o r ( k = 0 ; k < 4 ; k++) out [ j + 1 ] = ( b u i l t i n p o p c o u n t ( i n [ i ] & sec mask [ k ] ) & 1) << k ; r e t u r n j ; / Eight to Seventeen / c o n s t char dec mask [ 9 ] = { 0x31, 0 xf4, 0xc9, 0x2a, 0xbd, 0 x5f, 0 xfe, 0x2d, 0 x5a ; s h o r t d e c e r r o r s [ 1 7 ] = { 1 ; void d e c i n i t ( ) { i n t i, k ; f o r ( i = 0 ; i < 8 ; i ++) { d e c e r r o r s [ i ] = 0 ; f o r ( k = 0 ; k < 9 ; k++) i f ( dec mask [ k ] & (1 << i ) ) d e c e r r o r s [ i ] = 1 << k ; f o r ( ; i < 1 7 ; i ++) d e c e r r o r s [ i ] = 1 << ( i 8 ) ; i n t decr ( char in, i n t len, char out ) { i n t i, j, k, l ; unsigned s h o r t er, m; r e t u r n l e n / 3 ; i f ( d e c e r r o r s [ 0 ] == 1) d e c i n i t ( ) ; f o r ( i = j = 0 ; i < l e n ; i += 3, j++) { Telekomunikacja: Grzegorz Graczyk i Paweł Tarasiuk 8 / 11

out [ j ] = i n [ i ] ; e r = 0 ; m = ( i n [ i + 2 ] << 8) ( unsigned char ) i n [ i + 1 ] ; f o r ( k = 0 ; k < 9 ; k++, m >>= 1) { i f ( ( b u i l t i n p o p c o u n t ( i n [ i ] & dec mask [ k ] ) & 1)!= (m & 1 ) ) e r = 1 << k ; // f p r i n t f ( s t d e r r, %x\n, e r ) ; f o r ( k = 0 ; e r && k < 1 7 ; k++) i f ( d e c e r r o r s [ k ] == e r ) { e r = 0 ; i f ( k < 8) out [ j ] ˆ= 1 << k ; i f ( v e r b o s e ) f p r i n t f ( s t d e r r, Error at %d b i t! \ n, k ) ; f o r ( k = 0 ; e r && k < 1 7 ; k++) f o r ( l = k + 1 ; e r && l < 1 7 ; l ++) i f ( ( d e c e r r o r s [ k ] ˆ d e c e r r o r s [ l ] ) == e r ) { // f p r i n t f ( s t d e r r, wtf : %x ˆ %x = %x\n, d e c e r r o r s [ k ], d e c e r r o r s [ l ], e r ) ; e r = 0 ; i f ( k < 8) out [ j ] ˆ= 1 << k ; i f ( l < 8) out [ j ] ˆ= 1 << l ; i f ( v e r b o s e ) f p r i n t f ( s t d e r r, E r r o r s at %d and %d b i t! \ n, k, l ) ; i f ( e r ) f p r i n t f ( s t d e r r, Unrepaired e r r o r! \ n ) ; r e t u r n j ; i n t dec ( char in, i n t len, char out ) { i n t i, j, k ; r e t u r n l e n 3 ; f o r ( i = j = 0 ; i < l e n ; i ++, j += 3) { out [ j ] = i n [ i ] ; out [ j + 1 ] = 0 ; f o r ( k = 0 ; k < 8 ; k++) out [ j + 1 ] = ( b u i l t i n p o p c o u n t ( i n [ i ] & dec mask [ k ] ) & 1) << k ; out [ j + 2 ] = ( b u i l t i n p o p c o u n t ( i n [ i ] & dec mask [ 8 ] ) & 1 ) ; r e t u r n j ; / / i n t e r r 1 ( char in, i n t len, char out ) { i n t i, r ; r e t u r n l e n ; f o r ( i = 0 ; i < l e n ; i += 2) { out [ i ] = i n [ i ] ; out [ i + 1 ] = i n [ i + 1 ] ; r = rand ( ) % 1 2 ; i f ( r < 8) out [ i ] ˆ= 1 << r ; e l s e out [ i + 1 ] ˆ= 1 << ( r 8 ) ; r e t u r n i ; i n t e r r 2 ( char in, i n t len, char out ) { i n t i, r ; Telekomunikacja: Grzegorz Graczyk i Paweł Tarasiuk 9 / 11

r e t u r n l e n ; f o r ( i = 0 ; i < l e n ; i += 3) { out [ i ] = i n [ i ] ; out [ i + 1 ] = i n [ i + 1 ] ; out [ i + 2 ] = i n [ i + 1 2 ] ; r = rand ( ) % 1 7 ; i f ( r < 8) out [ i ] ˆ= 1 << r ; e l s e i f ( r < 16) out [ i + 1 ] ˆ= 1 << ( r 8 ) ; e l s e out [ i + 2 ] ˆ= 1 << ( r 1 6 ) ; r e t u r n i ; / / i n t cat ( ) { i n t s i z e = 1024, l e n = 0, num ; char i n = malloc ( s i z e ), out = NULL; do { num = f r e a d ( i n + len, 1, s i z e len, input ) ; i f (num == 1) r e t u r n 1; l e n += num ; i f ( l e n == s i z e ) { s i z e <<= 1 ; i n = r e a l l o c ( in, s i z e ) ; w h i l e (num > 0 ) ; i f ( code ) { out = malloc ( code ( 0, len, 0 ) ) ; l e n = code ( in, len, out ) ; f w r i t e ( out, 1, len, output ) ; e l s e f w r i t e ( in, 1, len, output ) ; f r e e ( i n ) ; i f ( out ) f r e e ( out ) ; i n t term ( c o n s t char path ) { FILE f i l e = fopen ( path, r ) ; i n t v a l ; char buf [ 1 2 3 ] ; do { v a l = f g e t c ( f i l e ) ; i f ( v a l == EOF) putchar ( v a l ) ; w h i l e ( 1 ) ; f c l o s e ( f i l e ) ; r e t u r n 0 ; void d e s t r u c t o r ( ) { i f ( input!= s t d i n ) f c l o s e ( input ) ; i f ( output!= stdout ) f c l o s e ( output ) ; #d e f i n e CODE( name ) i f ( strcmp ( argv [ i ], #name ) == 0 ) code = &name ; i n t main ( i n t argc, c o n s t char c o n s t argv [ ] ) { Telekomunikacja: Grzegorz Graczyk i Paweł Tarasiuk 10 / 11

i n t i, j ; c o n s t char mode, port ; FILE f ; input = s t d i n ; output = stdout ; f o r ( i = 1, j = 0 ; i < argc ; i ++) { i f ( argv [ i ] [ 0 ] == ) switch ( argv [ i ] [ 1 ] ) { c a s e i : f = fopen ( argv[++ i ], rb ) ; i f ( f == NULL) i = argc ; e l s e input = f ; c a s e o : f = fopen ( argv[++ i ], wb ) ; i f ( f == NULL) i = argc ; e l s e output = f ; c a s e c : ++i ; CODE( s e c ) e l s e CODE( s e c r ) e l s e CODE( dec ) e l s e CODE( decr ) e l s e CODE( e r r 1 ) e l s e CODE( e r r 2 ) e l s e i = argc ; c a s e v : v e r b o s e = t r u e ; d e f a u l t : i = argc ; e l s e switch ( j++) { c a s e 0 : mode = argv [ i ] ; c a s e 1 : port = argv [ i ] ; d e f a u l t : i = argc ; i f ( i > argc j!= 1) { puts ( usage ) ; r e t u r n 1; i f ( strcmp (mode, cat ) == 0) r e t u r n cat ( ) ; // i f ( strcmp ( argv [ 1 ], term ) == 0 ) // r e t u r n term ( argv [ 2 ] ) ; // puts ( usage ) ; r e t u r n 1; Telekomunikacja: Grzegorz Graczyk i Paweł Tarasiuk 11 / 11