#!/usr/bin/perl # Coded by Trizen under the GPL. # Email: echo dHJpemVueEBnbWFpbC5jb20K | base64 -d # Website: http://trizen.go.ro # # This is script is just for education # and not for practical usage! # # The fastest way of doing this is of course: # printf '%b', 26; # prints: 11010 # print 0b11010; # prints: 26 # use bigint; use warnings; use strict; my @argv_nrs; my $verbose = 0; my $decoding = 0; foreach my $arg (@ARGV) { if ($arg =~ /^\d+$/) { push @argv_nrs, $arg; } elsif (chr ord $arg eq '-') { if ($arg =~ /^-+h(?:elp)?$/) { print <<"USAGE"; Usage: $0 [option] [value|binar]\n Options: -e, --encode -d, --decode -v, --verbose\n Examples: $0 121 $0 1111001 -d USAGE exit; } elsif ($arg =~ /^-+v(?:erbose)?$/) { $verbose = 1; } elsif ($arg =~ /^-+d(?:ecode)?$/) { $decoding = 1; } } } sub decode { my ($code) = @_; return '' unless $code =~ /^[10]$/; my $length = length($code) - 1; my $binar_code = 0; my $nr = 0; my $number = 0; foreach my $i (split(//, $code, 0)) { $nr = $number ? ($number - 1) : $length; $number = $nr; $binar_code += $i * 2**$nr; if ($verbose) { print "$i * 2^$nr = ", $i * 2**$nr, "\n"; } ++$length; } print "\n" if $verbose; return $binar_code; } sub encode { my ($nr) = @_; return '' unless $nr =~ /^\d+$/; return $nr if $nr < 2; my @encoded_array; my $divised = 0; while ($divised != 1) { if ($verbose) { print "\n$nr\t= "; } $divised = int $nr / 2; if ($verbose) { print "$divised\t * 2 \t+ (", $nr - $divised * 2, ')'; } push @encoded_array, $nr - $divised * 2; $nr = $divised; } print "\n1\t= 0\t * 2 \t+ (1)\n" if $verbose; return 1 . reverse(@encoded_array); } sub _decode { if (@argv_nrs) { foreach my $n (@argv_nrs) { print decode($n) . "\n"; } } else { print "=>> Decode a value:\n> "; foreach my $n (split(/\D+/, , 0)) { print decode($n), "\n"; } exit; } } sub _encode { if (@argv_nrs) { foreach my $n (@argv_nrs) { print encode($n) . "\n"; } } else { print "=>> Encode a value:\n> "; foreach my $n (split(/\D+/, , 0)) { print encode($n), "\n"; } exit; } } $decoding ? _decode() : _encode();