File Coverage

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


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