GMAC Frame by using Perl

#!/usr/bin/perl
my @crc;
$preamble = '1010101010101010101010101010101010101010101010101010101010101011';
$da = '110111111101110100111101110000111101110000111101';
$sa = '110000111101110000111101110000111101110000111101';

$data_len = int( rand(50)) + 46;
print "$data_len ok\n";
$data_len_str = dec2bin($data_len);
#print "yes $data_len_str\n";

for ($i=0; $i < $data_len; $i++)
#for ($i=0; $i < 2; $i++)
{
$data_random = int( rand(255));
#print "$data_random \n";
$data_ran_str = dec2bin($data_random);
$pay_load = $pay_load . substr($data_ran_str,8);
#print "es $pay_load\n";
}
$crc_str_data = $da . $sa . $pay_load;
$crc_ini = '11111111111111111111111111111111' ;
@crc = split ("",$crc_ini);
print "\n crc initial @crc\n";
for ($i=0; $i < $data_len + 12; $i++)
{
print "for loop $i    ";
$crc_char = substr ($crc_str_data , 8*$i ,8);
chomp($crc_char);
@data = split ("", $crc_char);
open (ABC,">> crccheck.txt");
print ABC "data $crc_char\n  d0 @data[0] d1 @data[1] d2 @data[2] d3 @data[3],d4 @data[4] d5 @data[5] d6 @data[6] d7 @data[7]    ";
        @crc1[0]  = @data[6] ^ @data[0] ^ @crc[24] ^ @crc[30];
        print ABC "@crc11[0] @crc11[1] crc0= @crc1[0], data6= @data[6], data0= @data[0] ,crc24= @crc[24], crc30= @crc[30] \n";
        @crc1[1]  = @data[7] ^ @data[6] ^ @data[1] ^ @data[0] ^ @crc[24] ^ @crc[25] ^ @crc[30] ^ @crc[31];
        @crc1[2]  = @data[7] ^ @data[6] ^ @data[2] ^ @data[1] ^ @data[0] ^ @crc[24] ^ @crc[25] ^ @crc[26] ^ @crc[30] ^ @crc[31];
        @crc1[3]  = @data[7] ^ @data[3] ^ @data[2] ^ @data[1] ^ @crc[25] ^ @crc[26] ^ @crc[27] ^ @crc[31];
        @crc1[4] = @data[6] ^ @data[4] ^ @data[3] ^ @data[2] ^ @data[0] ^ @crc[24] ^ @crc[26] ^ @crc[27] ^ @crc[28] ^ @crc[30];
        @crc1[5]  = @data[7] ^ @data[6] ^ @data[5] ^ @data[4] ^ @data[3] ^ @data[1] ^ @data[0] ^ @crc[24] ^ @crc[25] ^ @crc[27] ^ @crc[28] ^ @crc[29] ^ @crc[30] ^ @crc[31];
        @crc1[6] = @data[7] ^ @data[6] ^ @data[5] ^ @data[4] ^ @data[2] ^ @data[1] ^ @crc[25] ^ @crc[26] ^ @crc[28] ^ @crc[29] ^ @crc[30] ^ @crc[31];
        @crc1[7]  = @data[7] ^ @data[5] ^ @data[3] ^ @data[2] ^ @data[0] ^ @crc[24] ^ @crc[26] ^ @crc[27] ^ @crc[29] ^ @crc[31];
        @crc1[8] = @data[4] ^ @data[3] ^ @data[1] ^ @data[0] ^ @crc[0]  ^ @crc[24] ^ @crc[25] ^ @crc[27] ^ @crc[28];
        @crc1[9]  = @data[5] ^ @data[4] ^ @data[2] ^ @data[1] ^ @crc[1]  ^ @crc[25] ^ @crc[26] ^ @crc[28] ^ @crc[29];
        @crc1[10] = @data[5] ^ @data[3] ^ @data[2] ^ @data[0] ^ @crc[2]  ^ @crc[24] ^ @crc[26] ^ @crc[27] ^ @crc[29];
        @crc1[11] = @data[4] ^ @data[3] ^ @data[1] ^ @data[0] ^ @crc[3]  ^ @crc[24] ^ @crc[25] ^ @crc[27] ^ @crc[28];
        @crc1[12] = @data[6] ^ @data[5] ^ @data[4] ^ @data[2] ^ @data[1] ^ @data[0] ^ @crc[4]  ^ @crc[24] ^ @crc[25] ^ @crc[26] ^ @crc[28] ^ @crc[29] ^ @crc[30];
        @crc1[13] = @data[7] ^ @data[6] ^ @data[5] ^ @data[3] ^ @data[2] ^ @data[1] ^ @crc[5]  ^ @crc[25] ^ @crc[26] ^ @crc[27] ^ @crc[29] ^ @crc[30] ^ @crc[31];
        @crc1[14] = @data[7] ^ @data[6] ^ @data[4] ^ @data[3] ^ @data[2] ^ @crc[6] ^ @crc[26] ^ @crc[27] ^ @crc[28] ^ @crc[30] ^ @crc[31];
        @crc1[15]= @data[7] ^ @data[5] ^ @data[4] ^ @data[3] ^ @crc[7]  ^ @crc[27] ^ @crc[28] ^ @crc[29] ^ @crc[31];
        @crc1[16] = @data[5] ^ @data[4] ^ @data[0] ^ @crc[8]  ^ @crc[24] ^ @crc[28] ^ @crc[29];
        @crc1[17] = @data[6] ^ @data[5] ^ @data[1] ^ @crc[9]  ^ @crc[25] ^ @crc[29] ^ @crc[30];
        @crc1[18] = @data[7] ^ @data[6] ^ @data[2] ^ @crc[10] ^ @crc[26] ^ @crc[30] ^ @crc[31];
        @crc1[19]= @data[7] ^ @data[3] ^ @crc[11] ^ @crc[27] ^ @crc[31];
        @crc1[20] = @data[4] ^ @crc[12] ^ @crc[28];
        @crc1[21] = @data[5] ^ @crc[13] ^ @crc[29];
           @crc1[22] = @data[0] ^ @crc[14] ^ @crc[24];
        @crc1[23] = @data[6] ^ @data[1] ^ @data[0] ^ @crc[15] ^ @crc[24] ^ @crc[25] ^ @crc[30];
        @crc1[24] = @data[7] ^ @data[2] ^ @data[1] ^ @crc[16] ^ @crc[25] ^ @crc[26] ^ @crc[31];
          @crc1[25]= @data[3] ^ @data[2] ^ @crc[17] ^ @crc[26] ^ @crc[27];
           @crc1[26]= @data[6] ^ @data[4] ^ @data[3] ^ @data[0] ^ @crc[18] ^ @crc[24] ^ @crc[27] ^ @crc[28] ^ @crc[30];
        @crc1[27] = @data[7] ^ @data[5] ^ @data[4] ^ @data[1] ^ @crc[19] ^ @crc[25] ^ @crc[28] ^ @crc[29] ^ @crc[31];
        @crc1[28] = @data[6] ^ @data[5] ^ @data[2] ^ @crc[20] ^ @crc[26] ^ @crc[29] ^ @crc[30];
        @crc1[29] = @data[7] ^ @data[6] ^ @data[3] ^ @crc[21] ^ @crc[27] ^ @crc[30] ^ @crc[31];
           @crc1[30] = @data[7] ^ @data[4] ^ @crc[22] ^ @crc[28] ^ @crc[31];
           @crc1[31]= @data[5] ^ @crc[23] ^ @crc[29];
       
      @crc = @crc1 ;

#print" data @data \n"

      

}
$crc_32 = "@crc";
$crc_32 =~ s/(.)\s/$1/seg;
#$init_value1 = 0 unless (defined $init_value);
 #$polynomial1 = 0xedb88320 unless (defined $polynomial);
#$crc_32 = mycrc32 ($crc_str_data,$init_value1,$polynomial1);
print "\n$crc_32";

$frame_data = $preamble . $crc_str_data . $crc_32 ;

sub dec2bin
{
   my $str1 = unpack("B16", pack("n", shift));
  # my $str = unpack("B32", pack("N", shift));
    #$str1 = substr($str, 16);
    return $str1;
}
 
       
  sub mycrc32 {
 my ($input, $init_value, $polynomial) = @_;
print "$input";
 $init_value = 0 unless (defined $init_value);
 $polynomial = 0xedb88320 unless (defined $polynomial);

 my @lookup_table;

 for (my $i=0; $i<256 br="" i="">   my $x = $i;
   for (my $j=0; $j<8 br="" j="">     if ($x & 1) {
       $x = ($x >> 1) ^ $polynomial;
     } else {
       $x = $x >> 1;
     }
   }
   push @lookup_table, $x;
 }

 my $crc = $init_value ^ 0xffffffff;

 foreach my $x (unpack ('C*', $input)) {
   $crc = (($crc >> 8) & 0xffffff) ^ $lookup_table[ ($crc ^ $x) & 0xff ];
 }

 $crc = $crc ^ 0xffffffff;

 return $crc;
}