150875
numer indeksu
Grzegorz Graczyk
imi i nazwisko
151021
numer indeksu
Paweł Tarasiuk
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. Pierw- szy 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 postawio- nego problemu. Wyróżnione zostały np. funkcje przekształcające dane z pliku do postaci wekto- ró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 ma- cierzy 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=
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
Dla korekty jednego błędu, oraz:
H
2=
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
Dla korekty dwóch błędów.
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 uniksopo- bobnymi. 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
#! / u s r / b i n / env python i m p o r t s y s
i m p o r t random
#
# Agumenty programu :
# 1 l u b 2 − t r y b p r a c y ( p r z y g o t o w a n i e do k o r e k c j i 1 b i t u na 12 l u b 2 b i t o w na 1 7 )
# e n c l u b d e c − p r z y g o t o w a n i e l u b o d c z y t
# p l i k w e j s c i o w y
# p l i k w y j s c i o w y
#
# m a c i e r z do k o r e k t y j e d n e g o b l e d u p r z y 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 ] ]
# m a c i e r z do k o r e k t y dwoch bledow p r z y 8 b i t a c h danych − 9 b i t o w k o n t r o l n y c h
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 m a c i e r z y H s l u z a c e j do naprawy j e d n e g o b l e d u
# i i n f o r m u j e o e w e n t u a l n y c h b l e d a c h w m a c i e r z y 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 x r a n g e ( l e n (HT [ 0 ] ) ) : HT[ − 1 ] . append ( 0 )
h = l e n (HT)
f o r i i n x r a n g e ( h ) : f o r j i n x r a n g e ( i ) :
i f HT[ i ] == HT[ j ] : i f n o t q u i e t :
p r i n t ” Columns %d and %d a r e e q u a l . ” % ( i , j ) r e t u r n F a l s e
r e t u r n True
# sprawdza poprawnosc m a c i e r z y H s l u z a c e j do naprawy dwoch bledow
# i i n f o r m u j e o e w e n t u a l n y c h b l e d a c h w m a c i e r z y 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 x r a n g e ( l e n (HT [ 0 ] ) ) : HT[ − 1 ] . append ( 0 )
h = l e n (HT) P = [ ]
f o r i i n x r a n g e ( h ) : f o r j i n x r a n g e ( i ) :
i f HT[ i ] == HT[ j ] : i f n o t q u i e t :
p r i n t ” Columns %d and %d a r e e q u a l . ” % ( i , j ) r e t u r n F a l s e
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 x r a n g e ( h ) : f o r j i n x r a n g e ( h ) :
i f i != j :
i f P [ i ] [ 0 ] == P [ j ] [ 0 ] : i f n o t q u i e t :
p r i n t(” Columns (%d , %d ) and (%d , %d ) have e q u a l sums . ”
% (P [ i ] [ 1 ] , P [ i ] [ 2 ] , P [ j ] [ 1 ] , P [ j ] [ 2 ] ) ) r e t u r n F a l s e
r e t u r n True
# g e n e r u j e m a c i e r z , np .
# m a t r i x g e n ( 4 , m a t r i x t e s t 1 ) − l o s u j e m a c i e r z do k o r e k c j i j e d n e g o b l e d u
# m a t r i x g e n ( 9 , m a t r i x t e s t 2 ) − l o s u j e m a c i e r z do k o r e k c j i dwoch bledow
# m a t r i x g e n ( 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 m a t r i x g e n ( t , t e s t ) :
U = [ ] P = [ ] s = 0
f o r i i n x r a n g e ( t + 1 ) : U . append ( [ ] )
f o r j i n x r a n g e ( t ) : U [ i ] . append ( 0 ) f o r i i n x r a n g e ( 1 , t + 1 ) :
U [ i ] [ i − 1 ] = 1 f o r i i n x r a n g e ( 1 << t ) :
P . append ( [ ] )
f o r j i n x r a n g e ( t ) :
P [ i ] . append ( i n t ( b o o l ( 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 . s a m p l e (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 s a m p l e s : %d” % ( s + 1 ) p r i n t ” R e s u l t : [ ”
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 % 2 50 00 == 0 :
p r i n t ” Analyzed s a m p l e s : %d” % s
# d o d a j e b i t y k o n t r o l n e do t a b l i c y b i t o w 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 x r a n g e ( n ) :
c = 0
f o r j i n x r a n g e (m) :
c ˆ= H [ i ] [ j ] & T [ j ] [ 0 ] S . append ( [ c ] )
r e t u r n S
# mnozy m a c i e r z e
d e f b o o l m a t r i x m u l (A, B ) : i f l e n (A [ 0 ] ) != l e n (B ) :
r e t u r n F a l s e R = [ ]
h = l e n (A) w = l e n (B [ 0 ] ) n = l e n (B)
f o r i i n x r a n g e ( h ) : R . append ( [ ] )
f o r j i n x r a n g e (w ) : R [ i ] . append ( 0 )
f o r k i n x r a n g e ( n ) :
R [ i ] [ j ] ˆ= A [ i ] [ k ] & B [ k ] [ j ] r e t u r n R
# d o d a j e w e k t o r y jednowymiarowe
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 e t u r n F a l s e R = [ ]
l = l e n (A)
f o r i i n x r a n g e ( 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 m a c i e r z 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 x r a n g e (w ) : R . append ( [ ] )
f o r j i n x r a n g e ( h ) : R [ i ] . append (A [ j ] [ i ] ) r e t u r n R
# wprowadza b l e d y do t a b l i c y b i t o w d e f a d d e r r o r s (V, n ) :
R = V
f o r r i n random . s a m p l e ( r a n g e ( l e n (V) ) , n ) : R [ r ] [ 0 ] ˆ= 1
r e t u r n R
# sprawdza , c z y czasem m a c i e r z n i e z a w i e r a j a k i e g o s n i e z e r o w e g o p o l a d e f i s z e r o (A ) :
t r y:
f o r i i n x r a n g e ( l e n (A ) ) : i f n o t i s z e r o (A [ i ] ) :
r e t u r n F a l s e r e t u r n True
e x c e p t:
r e t u r n n o t b o o l ( i n t (A) )
# w y s z u k u j e e l e m e n t w t a b l i c y ( n i e c h c e nam s i e potem o b s l u g i w a c bledow −
# j a k e l e m e n t u n i e ma , chcemy w a r t o s c −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 . i n d e x ( e ) e x c e p t:
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 x r a n g e ( l e n (A ) ) : A [ i ] = m a k e f l a t (A [ i ] ) r e t u r n A
e x c e p t: r e t u r n A
# u s t a l a , na j a k i c h p o z y c j a c h s a b l e d y d e f f i n d e r r o r s (H, E ) :
M = m a k e f l a t ( b o o l m a t r i x m u l (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 x r a n g e ( 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 ]
# z a m i e n i a c i a g b a j t o w na t a b l i c e b i t o w o z a d a n e j 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 = o r d ( b [ 0 ] ) f o r i i n x r a n g e ( 8 ) :
R . i n s e r t ( p , t & 1 ) t >>= 1
p += 8 b = b [ 1 : ]
i f b == ’ ’: b = ’ \0 ’ t = o r d ( 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
# z a m i e n i a t a b l i c e b i t o w na c i a g b a j t o w 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 += c h r ( n ) i f C :
r += a r r 2 b y t e s (C) r e t u r n r
# p r z y g o t o w u j e 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 z a s z u m i a j a c go d e f e n c o d e f i l e ( inn , outn , H, e = 0 ) :
f i n = open ( inn , ’ r b ’) f o u t = open ( outn , ’wb ’) w h i l e True :
c = f i n . r e a d ( 1 ) i f c == ’ ’:
b r e a k
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 o d e b r a n y 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 , ’ r b ’) 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 . r e a d ( b ) i f c == ’ ’:
b r e a k
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 ” E r r o r : d a t a n o t r e c o g n i z e d a t a l l ( and , e s p e c i a l l y , n o t 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 e x p e c t e d . P r o b a b l y m i s t a k e n due t o t o o buggy ” +
” d a t a . ”) f o r x i n E :
R [ x ] [ 0 ] ˆ= 1
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 . a r g v ) != 5 :
p r i n t ”Too l i t t l e a r g u m e n t s . ” p r i n t
p r i n t ”USAGE: ”
p r i n t ”%s 1 | 2 e n c | d e c INFILE OUTFILE”
s y s . e x i t ( )
i f s y s . a r g v [ 1 ] == ’ 1 ’: c o n f i g = c o n f i g s [ 0 ] e l i f s y s . a r g v [ 1 ] == ’ 2 ’:
c o n f i g = c o n f i g s [ 1 ]
i f n o t 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 m a t r i x . . . ” e x i t ( )
i f s y s . a r g v [ 2 ] == ’ e n c ’:
e n c o d e f i l e ( s y s . a r g v [ 3 ] , s y s . a r g v [ 4 ] , c o n f i g [ 0 ] , c o n f i g [ 2 ] ) e l i f s y s . a r g v [ 2 ] == ’ d e c ’:
d e c o d e f i l e ( s y s . a r g v [ 3 ] , s y s . a r g v [ 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 c h a r u s a g e [ ] = ” 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”
// ” s e n d − s e n d f i l e u s i n g xmodem\n”
” c a t − w r i t e i n p u t t o o u t p u t \n”
// ” P o r t : \ n”
// ” e n t e r p o r t a s 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 u s e FILE a s i n p u t \n”
” −o f i l e u s e FILE a s o u t p u t \n”
” −c c o d e e n c o d e f i l e u s i n g CODE\n”
” c o d e s : \n”
” s e c S i n g l e E r r o r C o r r e c t i o n \n”
” s e c r S i n g l e E r r o r C o r r e c t i o n R e v e r t \n”
” d e c Double E r r o r C o r r e c t i o n \n”
” d e c r Double E r r o r C o r r e c t i o n R e v e r t \n”
” e r r 1 C r e a t e e r r o r s f o r SEC\n”
” e r r 2 C r e a t e e r r o r s f o r DEC\n” ” −v v e r b o s e mode\n”;
/∗ s s e c i n g s : ∗/
#d e f i n e b o o l c h a r
#d e f i n e t r u e ( ( b o o l ) 1 )
#d e f i n e f a l s e ( ( b o o l ) 0 )
t y p e d e f i n t ( ∗ c o d e r ) (c h a r ∗ , i n t , c h a r ∗ ) ;
FILE ∗ i n p u t ; FILE ∗ o u t p u t ; c o d e r c o d e = NULL ; b o o l v e r b o s e = f a l s e ; /∗ kodowanie ( zad2 ) ∗/
/∗ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− E i g h t t o Twelve −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ∗/
c o n s t c h a r s e c m a s k [ 4 ] = { 0 x 0 f , 0 x71 , 0 xb6 , 0 xda } ;
i n t s e c r (c h a r ∗ i n , i n t l e n , c h a r ∗ ou t ) { i n t i , j , k ;
u n s i g n e d c h a r e r , m;
i f( i n == NULL) r e t u r n l e n / 2 ;
f o r( i = j = 0 ; i < l e n ; i += 2 , j ++) { o u t [ 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 , e r , m ) ;
i f( ( b u i l t i n p o p c o u n t ( i n [ i ] & s e c m a s k [ k ] ) & 1 ) == (m & 1 ) ) e r &= ˜ s e c m a s k [ k ] ;
e l s e
e r &= s e c m a s k [ k ] ; }
i f( v e r b o s e )
f p r i n t f ( s t d e r r , ” F i x i n g e r r o r ! \ n”, k ) ; o u t [ j ] ˆ= e r ;
}
r e t u r n j ; }
i n t s e c (c h a r ∗ i n , i n t l e n , c h a r ∗ ou t ) { i n t i , j , k ;
i f( i n == NULL) r e t u r n l e n ∗ 2 ;
f o r( i = j = 0 ; i < l e n ; i ++, j += 2 ) { o u t [ j ] = i n [ i ] ;
o u t [ j + 1 ] = 0 ;
f o r( k = 0 ; k < 4 ; k++)
o u t [ j + 1 ] |= ( b u i l t i n p o p c o u n t ( i n [ i ] & s e c m a s k [ k ] ) & 1 ) << k ; }
r e t u r n j ; }
/∗ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− E i g h t t o S e v e n t e e n −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ∗/
c o n s t c h a r dec mask [ 9 ] = { 0 x31 , 0 x f 4 , 0 xc9 , 0 x2a , 0xbd , 0 x 5 f , 0 x f e , 0 x2d , 0 x5a } ; s h o r t d e c e r r o r s [ 1 7 ] = { −1 } ;
v o i d 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 d e c r (c h a r ∗ i n , i n t l e n , c h a r ∗ ou t ) { i n t i , j , k , l ;
u n s i g n e d s h o r t e r , m;
i f( i n == NULL) 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 ++) {
o u t [ j ] = i n [ i ] ; e r = 0 ;
m = ( i n [ i + 2 ] << 8 ) | (u n s i g n e d c h a r) 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 )
o u t [ 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 , ” E r r o r a t %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 , ” w t f : %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 )
o u t [ j ] ˆ= 1 << k ; i f( l < 8 )
o u t [ 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 a t %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 , ” U n r e p a i r e d e r r o r ! \ n”) ; }
r e t u r n j ; }
i n t d e c (c h a r ∗ i n , i n t l e n , c h a r ∗ ou t ) { i n t i , j , k ;
i f( i n == NULL) r e t u r n l e n ∗ 3 ;
f o r( i = j = 0 ; i < l e n ; i ++, j += 3 ) { o u t [ j ] = i n [ i ] ;
o u t [ j + 1 ] = 0 ;
f o r( k = 0 ; k < 8 ; k++)
o u t [ 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 ; o u t [ 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 (c h a r ∗ i n , i n t l e n , c h a r ∗ ou t ) { i n t i , r ;
i f( i n == NULL) r e t u r n l e n ;
f o r( i = 0 ; i < l e n ; i += 2 ) { o u t [ i ] = i n [ i ] ;
o u t [ i + 1 ] = i n [ i + 1 ] ; r = rand ( ) % 1 2 ;
i f( r < 8 )
o u t [ i ] ˆ= 1 << r ; e l s e
o u t [ i + 1 ] ˆ= 1 << ( r − 8 ) ; }
r e t u r n i ; }
i n t e r r 2 (c h a r ∗ i n , i n t l e n , c h a r ∗ ou t ) { i n t i , r ;
i f( i n == NULL)
r e t u r n l e n ;
f o r( i = 0 ; i < l e n ; i += 3 ) { o u t [ i ] = i n [ i ] ;
o u t [ i + 1 ] = i n [ i + 1 ] ; o u t [ i + 2 ] = i n [ i + 1 2 ] ; r = rand ( ) % 1 7 ;
i f( r < 8 )
o u t [ i ] ˆ= 1 << r ; e l s e i f( r < 1 6 )
o u t [ i + 1 ] ˆ= 1 << ( r − 8 ) ; e l s e
o u t [ i + 2 ] ˆ= 1 << ( r − 1 6 ) ; }
r e t u r n i ; }
/∗ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− ∗/
i n t c a t ( ) {
i n t s i z e = 1 0 2 4 , l e n = 0 , num ;
c h a r ∗ i n = m a l l o c ( s i z e ) , ∗ ou t = NULL ;
do {
num = f r e a d ( i n + l e n , 1 , s i z e − l e n , i n p u t ) ; 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 ( i n , s i z e ) ; }
} w h i l e(num > 0 ) ;
i f( c o d e ) {
o u t = m a l l o c ( c o d e ( 0 , l e n , 0 ) ) ; l e n = c o d e ( i n , l e n , o u t ) ; f w r i t e ( out , 1 , l e n , o u t p u t ) ; } e l s e
f w r i t e ( i n , 1 , l e n , o u t p u t ) ;
f r e e ( i n ) ; i f( o u t )
f r e e ( o u t ) ; }
i n t term (c o n s t c h a r ∗ path ) { FILE ∗ f i l e = f o p e n ( path , ” r ”) ;
i n t v a l ; c h a r b u f [ 1 2 3 ] ;
do {
v a l = f g e t c ( f i l e ) ; i f( v a l == EOF)
b r e a k; p u t c h a r ( 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 ; }
v o i d d e s t r u c t o r ( ) { i f( i n p u t != s t d i n )
f c l o s e ( i n p u t ) ; i f( o u t p u t != s t d o u t )
f c l o s e ( o u t p u t ) ; }
#d e f i n e CODE( name ) i f( s t r c m p ( a r g v [ i ] , #name ) == 0 ) c o d e = &name ; i n t main (i n t a r g c , c o n s t c h a r ∗c o n s t a r g v [ ] ) {
i n t i , j ;
c o n s t c h a r ∗mode , ∗ p o r t ; FILE ∗ f ;
i n p u t = s t d i n ; o u t p u t = s t d o u t ;
f o r( i = 1 , j = 0 ; i < a r g c ; i ++) { i f( a r g v [ i ] [ 0 ] == ’− ’)
s w i t c h ( a r g v [ i ] [ 1 ] ) { c a s e ’ i ’:
f = f o p e n ( a r g v [++ i ] , ” r b ”) ; i f( f == NULL)
i = a r g c ; e l s e
i n p u t = f ; b r e a k;
c a s e ’ o ’:
f = f o p e n ( a r g v [++ i ] , ”wb”) ; i f( f == NULL)
i = a r g c ; e l s e
o u t p u t = f ; b r e a k;
c a s e ’ c ’: ++i ; CODE( s e c )
e l s e CODE( s e c r ) e l s e CODE( d e c ) e l s e CODE( d e c r ) e l s e CODE( e r r 1 ) e l s e CODE( e r r 2 ) e l s e i = a r g c ; b r e a k;
c a s e ’ v ’:
v e r b o s e = t r u e ; b r e a k;
d e f a u l t: i = a r g c ; } e l s e
s w i t c h ( j ++) { c a s e 0 :
mode = a r g v [ i ] ; b r e a k;
c a s e 1 :
p o r t = a r g v [ i ] ; b r e a k;
d e f a u l t: i = a r g c ; }
}
i f( i > a r g c | | j != 1 ) { p u t s ( u s a g e ) ;
r e t u r n −1;
}
i f( s t r c m p ( mode , ” c a t ”) == 0 ) r e t u r n c a t ( ) ;
// i f ( s t r c m p ( a r g v [ 1 ] , ” term ” ) == 0 ) // r e t u r n term ( a r g v [ 2 ] ) ;
// p u t s ( u s a g e ) ; r e t u r n −1;
}