Итак, у меня есть числовые значения от 0 до 15, поэтому я сохранил их в шестнадцатеричных кодах (от 0 до f). Теперь у меня есть строка данных, содержащая значения шестнадцатеричного кода моих кусочков.
Данные выглядят так:
a0fc3d78270db962e4ba525cf3acd
Каков точный/элегантный/быстрый способ выполнения двоичного xor для двух кусочков и каков будет самый быстрый способ выполнения двоичного кода не для кусочка?
Сейчас я имею в виду сначала преобразовать фрагменты в полные байты:
$nibble = "c";
$numeric = ord($nibble);
$byte = ($numeric<58)?chr($numeric-48):chr($numeric-55);
Затем выполните желаемую операцию (исключающее или нет) над этими байтами и снова преобразуйте полученное значение в полубайт.
$byte1 = chr(7); $byte2=chr(12);
$xor_val = $byte1 ^ $byte2;
$numeric = ord($xor_val);
$nibble = ($numeric<58)?chr($numeric+48):chr($numeric+55);
Проблема с этим подходом заключается в том, что если я применяю операцию not (~) к байту, она также меняет местами первые 4 бита (следовательно, добавляя 1111 к левой части полубайта), и мне приходится входить в дополнительную сложность вычитая 240 из значения ord() результата, прежде чем я снова преобразую его в откусывание с помощью кода, представленного выше. Это не только усложняет будущие обновления кода, но и затрудняет интерпретацию функциональности кода в будущем.
Каков наилучший/точный способ выполнения побитового xor, а не на откусках и получения результирующего значения в виде шестнадцатеричного кода (строки)?
Примеры:
'3' xnor 'a' = '6'
'c' xnor '5' = '6'
'b' xnor '8' = 'c'