in reply to Re^3: Equivalent of unpack 'q' with 32-bit Perl (a8)
in thread Equivalent of unpack 'q' with 32-bit Perl
The following code works
#!/usr/bin/perl use strict; use warnings; use Digest::MD5 'md5'; use Math::BigInt; my $thing = 'This is a thing'; my $md5 = md5($thing); print unpack('q', $md5), "\n"; print md5_32bit_sol($md5), "\n"; sub md5_32bit_sol { my ($md5) = @_; return md5_32bit_positive($md5) if vec($md5, 63, 1) == 0; return md5_32bit_negative($md5); } sub md5_32bit_negative { my ($md5) = @_; my $base_2 = ''; for (reverse 0 .. 63) { $base_2 .= abs(vec($md5, $_, 1) - 1); } $base_2 =~ s/^0+//; my $decimal = Math::BigInt->new(); my $power = Math::BigInt->new(2); $power->bpow(length($base_2) - 1); for my $pos (0 .. length($base_2) - 1) { $decimal->badd($power * substr($base_2, $pos, 1)); $power->bdiv(2); } return ($decimal + 1) * -1; } sub md5_32bit_positive { my ($md5) = @_; my $base_2 = ''; for (reverse 0 .. 63) { $base_2 .= vec($md5, $_, 1); } $base_2 =~ s/^0+//; my $decimal = Math::BigInt->new(); my $power = Math::BigInt->new(2); $power->bpow(length($base_2) - 1); for my $pos (0 .. length($base_2) - 1) { $decimal->badd($power * substr($base_2, $pos, 1)); $power->bdiv(2); } return $decimal; }
I am not sure why the code for handling negative numbers is so weird but it works for everything I tested.
Cheers - L~R
|
---|
Replies are listed 'Best First'. | |
---|---|
Re^5: Equivalent of unpack 'q' with 32-bit Perl (a8)
by Anonymous Monk on Sep 06, 2016 at 23:41 UTC | |
by Limbic~Region (Chancellor) on Sep 06, 2016 at 23:51 UTC | |
by RonW (Parson) on Sep 07, 2016 at 20:41 UTC | |
by Limbic~Region (Chancellor) on Sep 07, 2016 at 20:54 UTC | |
by RonW (Parson) on Sep 08, 2016 at 16:34 UTC | |
by Anonymous Monk on Sep 07, 2016 at 22:14 UTC |