in reply to Re: perl arithmetic is killing me! HELP!
in thread perl arithmetic is killing me! HELP!
use strict; use warnings; use integer; my $string = 'Hello World!'; my $x = Checksum($string); printf("\n\nChecksum = %0.8X\n", $x); exit; # # This function returns a 32-bit integer. # # Usage: LONG = Checksum(STRING) # sub Checksum { my $C = 0x55555555; # Starting value. # Make sure we got a valid string argument. @_ or return $C; my $S = shift; defined $S or return $C; # Start the loop with the # last character of the string: my $i = length($S); my $V; my $H; my $L; while ($i--) { # $V contains the character code shifted # to the left by either 0, 8, 16, or 24 bits: $V = ((vec($S, $i, 8) + 1) << (($i & 3) << 3)); # We add this value to the checksum $C $C += $V; # Then we rotate this 32-bit "checksum" to # the left by 1. There is no ROL operator # in Perl, so we take the 32nd bit ($H) and # then we shift the rest to the left, and # finally we OR the low and high bits # together to achieve the desired rotation. # So, it would look something like this: # 01110101011111111101000001110000 <<< # 11101010111111111010000011100000 <<< # 11010101111111110100000111000001 <<< # 10101011111111101000001110000011 <<< # 01010111111111010000011100000111 <<< # 10101111111110100000111000001110 <<< # 01011111111101000001110000011101 <<< # 10111111111010000011100000111010 <<< # 01111111110100000111000001110101 <<< $H = (($C >> 31) & 1); $L = (($C << 1) & 0xFFFFFFFE); $C = $H | $L; # Now, here we print a snapshot of $V # and we print the high bit and the low # portion of the integer: printf("\nV=%0.8X \tH=$H L=%0.32b", $V, $L); } # Make sure we return a 32-bit integer return $C & 0xFFFFFFFF; }
|
|---|