Prerequisites
PHP 5.3.6 32-bit (moving to 64-bit is not possible).
Need to compare 2 values uint64
(8-byte unsigned integers). One of them I get as string and another as binary string.
Question
Is it possible to convert string representation of uint64
to array of 8 bytes, or convert array of 8 bytes into string with uint64
on PHP 32bit?
Illustration
I tried base_convert
function to compare base-2 string representations and got weird results. I know that byte array contains the same uint64
as the corresponding string. But I have no idea on how to ensure that they do represent the same number.
This is test code with some real values to illustrate the problem:
function byte_to_base2string($byte)
{
$byte = base_convert($byte, 10, 2);
$byte = str_pad($byte, 8, '0', STR_PAD_LEFT);
return $byte;
}
function print_info($base10_string1, $bin_string2)
{
$bin_string1 = null; // TODO: how to obtain it?
$base2_string1 = base_convert($base10_string1, 10, 2);
$base2_string1 = str_pad($base2_string1, 64, '0', STR_PAD_LEFT);
$base2_string2 = array_map('byte_to_base2string', $bin_string2);
$base2_string2 = implode('', $base2_string2);
$base10_string2 = base_convert($base2_string2, 2, 10);
echo sprintf("Wrong base-2 string:\n%s\t%s\n", $base10_string1, $base2_string1);
echo sprintf("base-2 string matches $base10_string1, but base-10 string does not\n%s\t%s\n", $base10_string2, $base2_string2);
echo "\n";
// Can't compare because:
// $base2_string1 != $base2_string2
// $base10_string1 != $base10_string2
// $bin_string1 no idea how to convert
}
$strings = [
'288512493108985552',
'288512958990381002',
'288512564016815754'
];
// obtained via unpack('C*', $binaryStr)
$bytes = [
[4, 1, 0, 149, 121, 5, 254, 208],
[4, 1, 1, 1, 241, 183, 239, 202],
[4, 1, 0, 165, 251, 117, 158, 138]
];
array_map('print_info', $strings, $bytes);
And the output is:
Wrong base-2 string:
288512493108985552 0000010000000001000000001001010101111001000001011111111011000000
base-2 string matches 288512493108985552, but base-10 string does not
288512493108985526 0000010000000001000000001001010101111001000001011111111011010000
Wrong base-2 string:
288512958990381002 0000010000000001000000010000000111110001101101111110111111000000
base-2 string matches 288512958990381002, but base-10 string does not
288512958990381002 0000010000000001000000010000000111110001101101111110111111001010
Wrong base-2 string:
288512564016815754 0000010000000001000000001010010111111011011101011001111010000000
base-2 string matches 288512564016815754, but base-10 string does not
288512564016815764 0000010000000001000000001010010111111011011101011001111010001010
Updated
Found a solution (see my answer below), but not sure if it is the best way. Still hope to find something more clear and straight.