<?php error_reporting(E_ALL); if ($argc != 3) { echo "Usage: \n"; echo "{$argv[0]} <crc32> <file>\n"; exit(); } define("CRCPOLY", 0xEDB88320); define("CRCINV", 0x5B358FD3); define("FINALXOR", 0xFFFFFFFF); $f_crc = $argv[1]; $file = $argv[2]; $f_crc = hexdec($f_crc); $o_file = file_get_contents($file); $f_file = substr($o_file, 0, -4); $t_crc = crc32($f_file); $n_cont = 0; $f_crc ^= FINALXOR; for ($i = 0; $i < 32; ++$i) { if ($n_cont & 1) { $n_cont = ($n_cont >> 1) ^ CRCPOLY; } else { $n_cont >>= 1; } if ($f_crc & 1) { $n_cont ^= CRCINV; } $f_crc >>= 1; } $n_cont ^= $t_crc; for ($i = 0; $i < 4; ++$i) { $tmp = ($n_cont >> $i*8) & 0xFF; $f_file .= chr($tmp); } printf("Old CRC32: %x\nNew CRC32: %x\n", crc32($o_file), crc32($f_file));