File Coverage

blib/lib/App/Bin/Search.pm
Criterion Covered Total %
statement 60 60 100.0
branch 18 18 100.0
condition 6 6 100.0
subroutine 7 7 100.0
pod 2 2 100.0
total 93 93 100.0


line stmt bran cond sub pod time code
1             package App::Bin::Search;
2              
3 4     4   104024 use strict;
  4         6  
  4         111  
4 4     4   25 use warnings;
  4         5  
  4         137  
5              
6 4     4   1417 use Bit::Vector;
  4         3661  
  4         214  
7 4     4   1699 use Getopt::Std;
  4         6769  
  4         2369  
8              
9             our $VERSION = 0.03;
10              
11             $| = 1;
12              
13             # Constructor.
14             sub new {
15 9     9 1 508903 my ($class, @params) = @_;
16              
17             # Create object.
18 9         20 my $self = bless {}, $class;
19              
20             # Object.
21 9         28 return $self;
22             }
23              
24             # Run.
25             sub run {
26 8     8 1 35 my $self = shift;
27              
28             # Process arguments.
29 8         33 $self->{'_opts'} = {
30             'b' => 0,
31             'h' => 0,
32             'v' => 0,
33             };
34 8 100 100     28 if (! getopts('bhv', $self->{'_opts'})
      100        
35             || $self->{'_opts'}->{'h'}
36             || @ARGV < 2) {
37              
38 3         431 print STDERR "Usage: $0 [-b] [-h] [-v] [--version] hex_stream search\n";
39 3         75 print STDERR "\t-b\t\tPrint in binary (default hexadecimal).\n";
40 3         33 print STDERR "\t-h\t\tPrint help.\n";
41 3         27 print STDERR "\t-v\t\tVerbose mode.\n";
42 3         23 print STDERR "\t--version\tPrint version.\n";
43 3         23 print STDERR "\thex_stream\tInput hexadecimal stream.\n";
44 3         36 print STDERR "\tsearch\t\tSearch string (in hex).\n";
45 3         13 return 1;
46             }
47 5         224 $self->{'_hex_stream'} = $ARGV[0];
48 5         7 $self->{'_search'} = $ARGV[1];
49              
50             $self->{'_bv'} = Bit::Vector->new_Hex(
51             length($self->{'_hex_stream'}) * 4,
52 5         52 $self->{'_hex_stream'},
53             );
54             $self->{'_bvs'} = Bit::Vector->new_Hex(
55             length($self->{'_search'}) * 4,
56 5         16 $self->{'_search'},
57             );
58              
59 5         7 my $processed_bits = 0;
60 5 100       11 if ($self->{'_opts'}->{'v'}) {
61 2 100       5 if ($self->{'_opts'}->{'b'}) {
62 1         35 print "Hexadecimal stream: ".$self->{'_bv'}->to_Bin."\n";
63             } else {
64 1         42 print "Hexadecimal stream: ".$self->{'_bv'}->to_Hex."\n";
65             }
66 2         79 print 'Size of hexadecimal stream: '.$self->{'_bv'}->Size."\n";
67 2 100       5 if ($self->{'_opts'}->{'b'}) {
68 1         2 my $len = length($self->{'_search'}) * 4;
69 1         16 printf "Looking for: %0${len}s\n", $self->{'_bvs'}->to_Bin;
70             } else {
71 1         9 print 'Looking for: '.$self->{'_search'}."\n";
72             }
73             }
74 5         20 while ($self->{'_bv'}->Size) {
75 120         113 $processed_bits++;
76 120 100       178 if ($self->{'_opts'}->{'v'}) {
77 48 100       63 if ($self->{'_opts'}->{'b'}) {
78 24         224 print $self->{'_bv'}->to_Bin.' at '.$processed_bits."bit\n";
79             } else {
80 24         27 print $self->_print_hex.' at '.$processed_bits."bit\n";
81             }
82             }
83              
84 120         214 my $s = $self->{'_bvs'}->to_Bin;
85 120 100       375 if ($self->{'_bv'}->to_Bin =~ m/^$s/ms) {
86 6 100       12 if ($self->{'_opts'}->{'b'}) {
87 2         95 print 'Found '.$self->{'_bv'}->to_Bin.' at '.$processed_bits." bit\n";
88             } else {
89 4         7 print 'Found '.$self->_print_hex.' at '.$processed_bits." bit\n";
90             }
91             }
92 120         306 $self->{'_bv'}->Resize($self->{'_bv'}->Size - 1);
93             }
94              
95 5         12 return 0;
96             }
97              
98             sub _print_hex {
99 28     28   26 my $self = shift;
100              
101 28         63 my $tmp = $self->{'_bv'}->Clone;
102 28         39 my $size = $tmp->Size;
103 28 100       40 my $plus = ($size % 4) ? 4 - ($size % 4) : 0;
104 28         59 $tmp->Resize($size + $plus);
105 28         43 $tmp->Move_Left($plus);
106              
107 28         384 return $tmp->to_Hex;
108             }
109              
110             1;
111              
112             __END__