Advertisement
bnghtz

fun_w_hamming_code.pl

Feb 27th, 2014
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 3.94 KB | None | 0 0
  1. #! /usr/bin/perl
  2.  
  3. #####  INCLUDES  #############################################################
  4. use warnings;
  5. use strict;
  6.  
  7. #####  GLOBALS  ##############################################################
  8. my ($hamLen, $maxDataLen);
  9. my @av = ([3,1], [7,4], [15,11], [31,26], [63,57], [127,120], [255,247]);
  10. # [$n+$maxlen, $maxlen], where $maxlen = (2**$n) - 1 - $n ;
  11.  
  12. #####  SUBS  #################################################################
  13. sub printHam(@)
  14. {
  15.   my $print_0_as_O = 0;
  16.   my @foo = @_;
  17.   map{'O' unless $_;} @foo if $print_0_as_O;
  18.   print join(', ', @foo) . "     " . join('', @foo) ."\n";
  19. }
  20.  
  21. # 110 -> 0110 -> 1100110   string or array
  22. # pairing bits   ^^ ^  
  23. sub genH($)
  24. {
  25.   my ($bindata) = @_;
  26.   my $ret;
  27.  
  28.   #=== fill up data w/ 0
  29.   while (length($bindata) < $maxDataLen)
  30.   {
  31.     $bindata = "0" . $bindata;
  32.   }
  33.  
  34.   #===== fill up the bindata code
  35.   # __0_110
  36.   my $par = 0;
  37.   my @data = split('', $bindata);
  38.   my @ham = ();
  39.  
  40.   for (my $i = 0; $i < $hamLen; $i++)
  41.   {
  42.     if (($i + 1) == 2**$par)
  43.     {
  44.       $ham[$i] = '0';
  45.       $par++;
  46.     }
  47.     else
  48.     {
  49.       my $n = ($i - $par);
  50.       $ham[$i] = $data[$n];
  51.     }
  52.   }
  53.  
  54.   #===== fill up pairing codes
  55.   # 11_0___
  56.   for (my $i = 0; $i < ($hamLen - $maxDataLen); $i++)
  57.   {
  58.     my $bit = 2**($i);
  59.     my $h = 0;
  60.     my $hatvany = 0;
  61.     for (my $j = 0; $j < $hamLen; $j++)
  62.     {
  63.       # check the bit pairing
  64.       next unless ($j+1) & $bit;
  65.       # skip myself
  66.       if ($j + 1 == 2**$hatvany)
  67.       {
  68.         $hatvany++;
  69.       }
  70.       else
  71.       {
  72.         $h = $h ^ $ham[$j];
  73.       }
  74.     }
  75.     $ham[$bit-1] = $h;
  76.   }
  77.  
  78.   $ret = join('', @ham);
  79.  
  80.   return wantarray ? @ham : $ret;
  81. }
  82.  
  83. # 1100 110 -> 0,0,0 -> 0
  84. # 1110 110 -> 1,1,0 -> 3
  85. # 0100 110 -> 1,0,0 -> 1
  86. sub checkPar($)
  87. {
  88.   my @ham = split('',$_[0]);
  89.   my $check = 0;
  90.   my @check;
  91.  
  92.   for (my $i = 0; $i < ($hamLen - $maxDataLen); $i++)
  93.   {
  94.     my $bit = 2**($i);
  95.     my $h = 0;
  96.     for (my $j = 0; $j < $hamLen; $j++)
  97.     {
  98.       $h = $h ^ $ham[$j] if ($j+1) & $bit;
  99.     }
  100.     $check += $bit if $h;
  101.     $check[$i] = $h;
  102.   }
  103.  
  104.   return wantarray ? @check : $check;
  105. }
  106.  
  107. sub genError($)
  108. {
  109.   my $txt = shift;
  110.   my @hiba = split('', $txt);
  111.   my $loc = int(rand($hamLen));
  112.   $hiba[$loc] = 1 & ~int($hiba[$loc]);
  113.   return wantarray ? @hiba : join('', @hiba);
  114. }
  115.  
  116. sub markError($;$)
  117. {
  118.   my ($ham, $n) = @_;
  119.   $n = checkPar($ham) unless defined $n;
  120.   my @ham = map {' '} split('', $ham);
  121.   $ham[$n - 1] = '!';
  122.   return wantarray ? @ham : join('', @ham);
  123. }
  124.  
  125. sub fixError($;$)
  126. {
  127.   my ($ham, $n) = @_;
  128.   $n = checkPar($ham) unless defined $n;
  129.   my @ham = split('', $ham);
  130.   $ham[$n - 1] = 1 & ~int($ham[$n - 1]);
  131.   return wantarray ? @ham : join('', @ham);
  132. }
  133.  
  134. #####  CODE  #################################################################
  135. my ($data, $error) = @ARGV;
  136. die "kell egy kezdo adat\n" unless defined($data);
  137. die "binaris szamot fogad el!\n" if $data =~ m/[^10]/;
  138.  
  139. #== check for applicable length
  140. my $dataLen = length($data);
  141. foreach (@av)
  142. {
  143.   next if ($dataLen > $_->[1]);
  144.   ($hamLen, $maxDataLen) = @{$_};
  145.   last;
  146. }
  147. die "tul hosszu szam\n" if (!$maxDataLen);
  148. die "max $maxDataLen jegyut fogad el a kod\n" if ($dataLen > $maxDataLen);
  149.  
  150. warn "H($hamLen, $maxDataLen)\n";
  151.  
  152. my $ham = genH($data);
  153. print "hamming  $ham\n";
  154. # my @ham = genH($data);
  155. # printHam(@ham);
  156.  
  157. my $c = checkPar($ham);
  158. print "parity   $c\n";
  159.  
  160. my $ham2 = genError($ham);
  161. print "error    $ham2\n";
  162.  
  163. $c = checkPar($ham2);
  164. print "parity   $c\n";
  165. my $mark = markError($ham2, $c);
  166. print "         $mark\n";
  167.  
  168. my $ham3 = fixError($ham2, checkPar($ham2));
  169. print "fixed    $ham3\n";
  170.  
  171. foreach (0 .. 3)
  172. {
  173.   my $err = genError($ham);
  174.   my $c = checkPar($err);
  175.   my $mark = markError($err, $c);
  176.   my $ham3 = fixError($err, $c);
  177.   print "----------" . "-" x $hamLen . "\n"
  178.       . "error    $err\n"
  179.       . "         $mark\n"
  180.   #    . "         $ham3\n\n"
  181.       ;
  182. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement