Как декодировать из шестнадцатеричной системы в двоичную, сохраняя первые нулевые байты?
Здравствуйте.
Может, вопрос в теме и не очень корректный, но я поясню.
Имеется HEX-строка вида: 00 00 00 С0 00 00 00 00
В каждом хекстете восемь байтов.
Суть задачи следующая: необходимо каждый хекстет перевести в двоичную систему (включая нулевые), выстроить нули и единицы "в ряд" и посчитать, какую позицию в строке занимает единица.
То есть из
00 00 00 С0 00 00 00 00
в
0000000000000000000000001100000000000000000000000000000000000000
и вывод: 25
и 26
.
Мне показалось это не такой сложной задачей, однако она меня поставила в тупик.
Вот отрывок кода:
$clean_hex="00 00 00 С0 00 00 00 00"; # Оригинальная HEX-строка
$clean_hex_no_spaces=str_replace(" ","",$clean_hex); // Удаляю пробелы
$clean_hex_no_null=str_replace("00","",$clean_hex_no_spaces); // Удаляю нули
$decode_no_null=base_convert("$clean_hex_no_null", 16, 2); // Конвертирую
$replace_nulls=str_replace("00","00000000",$clean_hex); // Вместо двух нулей ставлю восемь
$magic=str_replace("$clean_hex_no_null","$decode_no_null",$replace_nulls); // Меняю HEX-строку на бинарную
$almost_done=str_replace(" ","",$magic); // Удаляю пробелы
$done_first_port=strpos($almost_done,"1")+1; // Выясняю позицию первой единицы
$second_port=strpos($almost_done,"1",$done_first_port)+1;// Выясняю позицию последующей единицы
И эта костыльная кухня работает, но только в частных случаях. Если HEX вида 00 00 00 30 00 00 00 00, то в бинарном виде 30 будет выглядеть как 110000, но мне нужно, чтобы было 00110000. PHP, конечно, правильно убирает нули, так как чисел вида 00110000 не бывает.
Но мне важен каждый нулевой байт, чтобы позиция единиц не сбивалась. Как можно увидеть, мой код выше работает, только если строка содержит семь нулевых хекстетов из восьми, да ещё и не содержит хекстет с первыми нулевыми байтами.
А HEX может быть различный, например, C1 00 13 C0 00 00 00 00 или любая другая. Универсального решения не придумал.
Не подскажете, как можно быстро и просто реализовать подобную задачу на PHP?