PHP crc32 vs PERL crc32. Różne wartości

0

Witam

Trafiłem na następujący problem. Mianowicie modul PERLa String::CRC32 zwraca mi zupełnie inne wartości niż funkcja crc32 w PHP.
Przykład:

 <?php
echo crc32('abc123');
?>

Zwraca: -821904548

Natomiast PERL:

#!/usr/bin/perl -w
 use strict; 
use warnings;
use String::CRC32;
print crc32('abc123'), "\n";

Zwraca: 3473062748

OS: 32 bit

Czy ktoś z szanownych userow wie w czym tkwi problem?

pozdrawiam
Dawid

0

PHP traktuje wynik jako liczbę ze znakiem, a Perl nie.

0

Wynik jest dobry, do tego jest ten sam. Liczba bez znaku 3473062748 to szesnastkowo 0xCF02BB5C, zaś ta sama liczba szesnastkowa interpretowana jako 32-bitowa liczba ze znakiem to właśnie -821904548. Po prostu PHP zwraca w formie signed int, Perl unsigned int.

0

ok doczytalem na php.net.

Because PHP's integer type is signed, and many crc32 checksums will result in negative integers, you need to use the "%u" formatter of sprintf() or printf() to get the string representation of the unsigned crc32 checksum.

W zasadzie dopiero startuje z Perlem i mam problem w przekształceniu rezultatu string::crc32 na odpowiednik PHP crc32.

 #!/usr/bin/perl -w

use strict;
use warnings;
use integer;
use String::CRC32;
use POSIX;

my $php = -821904548; #php crc32('abc')
my $perl = 3473062748; #perl string::crc32('abc')

print  "INT_MAX : " . INT_MAX . "\n";
printf("Perl HEX: %#X \n", $perl );
printf("Perl Signed Decimal: %d\n", $perl);
printf("PHP  HEX: %#X \n", $php );

use integer miało załatwić sprawe z printf z konwersją '%u':

%d - a signed integer, in decimal

natomiast zwraca mi tą samą wartość z zmiennej $perl.

ouput:

 [dawid@nestle ~]$ ./test.pl
INT_MAX : 2147483647
Perl HEX: 0XCF02BB5C
Perl Signed Decimal: 3473062748
PHP  HEX: 0XFFFFFFFFCF02BB5C

Proszę o podpowiedź.

pozdrawiam
dawid

0

nie mogl tak ustawić ponieważ nie jest skompilowany z obsługą 64:

 [dawid@nestle ~]$ file `which perl`
/usr/bin/perl: symbolic link to `/usr/local/bin/perl5.12.3'
[dawid@nestle ~]$ file /usr/local/bin/perl5.12.3
/usr/local/bin/perl5.12.3: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), for FreeBSD 7.2, dynamically linked (uses shared libs), FreeBSD-style, stripped

0

ok mam:

 #!/usr/bin/perl -w

use strict;
use warnings;
use String::CRC32;

my $php = -821904548;  #php crc32('abc123')
my $perl = 3473062748; #perl String::CRC32 ('abc123')
my $signed_perl = undef;

if($perl >> 31)
    {
    $signed_perl = $perl - 2 ** 32;
    }
    else
    {
    $signed_perl = $perl;
    }
print("PHP  Signed: $php \n");
printf("PHP  HEX: %#x \n", $php );
print("Perl Signed: $signed_perl \n");
printf("Perl Signed HEX: %#x \n", $signed_perl);

output:

[dawid@nestle ~]$ ./test.pl
PHP  Signed: -821904548
PHP  HEX: 0xffffffffcf02bb5c
Perl Signed: -821904548
Perl Signed HEX: 0xffffffffcf02bb5c
 

1 użytkowników online, w tym zalogowanych: 0, gości: 1