У меня есть этот шестнадцатеричный код F0C2CA89012A04008C0000000000000000000000 от устройства. Этот шестнадцатеричный код показывает стоимость капель воды.
В моем коде Python
msg = F0C2CA89012A04008C0000000000000000000000
msg_counters = bytes.fromhex(msg)[5:20]
# output: b'*\x04\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
msg_counters_int = int.from_bytes(msg_counters)
# output: 218157641024778742068286256301735936
bin_string = '{:0120b}'.format(msg_counters_int)
print(bin_string)
это напечатает значение битов. Эти биты показывают ценность воды
001010100000010000000000100011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00101 = 5
01000 = 8
00010 = 2
Я пытаюсь преобразовать код в PHP и застреваю int.from_bytes из Python. Я не знаю, как преобразовать значение.
В моем PHP-коде
$a = hex2bin("F0C2CA89012A04008C0000000000000000000000");
$b = substr($a, 5, 20);
// output: b"*\x04\x00Œ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
Я пытался использовать функцию unpack, но она не показывает правильное значение.






Чтобы преобразовать этот код Python в PHP, вам необходимо выполнить манипуляции с шестнадцатеричными строками, нарезку байтов и преобразование целых чисел. Вот как вы можете добиться эквивалента в PHP:
msg = "F0C2CA89012A04008C0000000000000000000000"
msg_counters = bytes.fromhex(msg)[5:20]
msg_counters_int = int.from_bytes(msg_counters)
bin_string = '{:0120b}'.format(msg_counters_int)
print(bin_string)
<?php
$msg = "F0C2CA89012A04008C0000000000000000000000";
// Convert hex string to binary data
$msg_counters = hex2bin(substr($msg, 5, 30)); // Get the binary data from hex string
// Convert binary data to integer
$msg_counters_int = gmp_init(bin2hex($msg_counters), 16); // GMP for handling large integers
// Convert integer to binary string with leading zeros
$bin_string = str_pad(gmp_strval($msg_counters_int, 2), 120, '0', STR_PAD_LEFT);
echo $bin_string;
?>
Преобразование шестнадцатеричного кода в двоичный:
hex2bin(substr($msg, 5, 30)) преобразует соответствующую часть шестнадцатеричной строки в двоичные данные. substr($msg, 5, 30) извлекает подстроку, начиная с 6-го символа (индекс 5) и длиной 30 символов.Преобразование двоичного числа в целое число:
bin2hex($msg_counters) преобразует двоичные данные в шестнадцатеричные.gmp_init(bin2hex($msg_counters), 16) инициализирует число GMP (GNU Multiple Precision) из шестнадцатеричной строки, поскольку целочисленный тип PHP может не обрабатывать очень большие числа.Целое число в двоичную строку:
gmp_strval($msg_counters_int, 2) преобразует номер GMP в двоичную строку.str_pad(..., 120, '0', STR_PAD_LEFT) гарантирует, что двоичная строка имеет ведущие нули, соответствующие длине 120 бит.Этот фрагмент кода PHP обеспечивает результат, эквивалентный коду Python, преобразуя указанный сегмент шестнадцатеричной строки в двоичную строку с ведущими нулями.
Вы заметили, что ответ, сгенерированный вашим кодом, отличается от ответа, упомянутого в вопросе? Можете ли вы объяснить разницу?
Большое спасибо. Я не очень хорошо разбираюсь в функциональности битов. Я изучу код, на который вы ответили. Значение bin_string не совпадает с выводом Python, но я могу подстроить значение вашего вывода. это ваш вывод, и перед пунктирной линией я могу подставить значение 10101000100100000001 ----001010100000010000000000100011000000000000000000000000000000000000000000 0000000000000000000000000000
@user3391620 user3391620 «Я изучу код, на который вы ответили». Обратите внимание, что принятие ответа означает для людей, которые столкнутся с ним позже, что он действительно отвечает на вопрос, поэтому вам всегда следует не торопиться и проверять, что он действителен, прежде чем делать это.
Вот альтернативное решение, которое основано не на расширении GMP, а на стандартной функции base_convert(). Для каждого байта две шестнадцатеричные цифры извлекаются из входной строки и преобразуются в базу 2:
function getBits(string $msg, int $from, int $to)
{
$bits = '';
for($i=$from; $i<$to; $i++)
{
$s = base_convert(substr($msg, 2*$i, 2), 16, 2);
$bits .= str_pad($s, 8, '0', STR_PAD_LEFT);
}
return $bits;
}
echo getBits('F0C2CA89012A04008C0000000000000000000000', 5, 20);
Выход:
001010100000010000000000100011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
NameError: name 'F0C2CA89012A04008C0000000000000000000000' is not defined— укажите действительный код.