Чтобы получить отдельные биты:
$md5 = md5( "b", true );
$l = strlen( $md5 );
$bits = "";
for( $i = 0; $i < $l; ++$i ) {
$num = ord( $md5[$i] );
for( $j = 7; $j >= 0; --$j ) {
$bits .= ( $num & ( 1 << $j ) ) ? "1" : "0";
}
}
echo $bits."\n";
//10010010111010110101111111111110111001101010111000101111111011000011101011010111000111000111011101110101001100010101011110001111
echo asciibin2hex( $bits ) == md5("b"); // true
Итак, мы идем побайтово, и, поскольку он находится в строковой форме, нам нужно преобразовать его в число ASCII на ord()
. Теперь пройдитесь по байтам, понемногу и посмотрите, какие из них включены, а какие выключены, и объедините их со строкой битов. Перейдите к следующему байту, промойте и повторяйте, пока все 128 бит не будут прочитаны.
Считать третий бит (слева) в третьем байте:
ord( $md5[2] ) & ( 1 << ( 8 - 3 ) )
возвращает 1, если бит включен, 0 в противном случае