У меня есть следующая строка в моих сценариях PHP и C ++:
152F302436152F302435152F302434152F302433152F302433
В PHP я использую встроенную функцию hex2bin как:
<?php
$HEXString = "152F302436152F302435152F302434152F302433152F302433";
echo hex2bin($HEXString);
//Outputs: /0$6/0$5/0$4/0$3/0$3
?>
Тем не менее, в C ++ я использую следующие функции для достижения того же с полным другим результатом:
const char* HexCharToBin(char c) {
char cUpper = toupper(c);
if (cUpper == '0') return "0000";
else if (cUpper == '1') return "0001";
else if (cUpper == '2') return "0010";
else if (cUpper == '3') return "0011";
else if (cUpper == '4') return "0100";
else if (cUpper == '5') return "0101";
else if (cUpper == '6') return "0110";
else if (cUpper == '7') return "0111";
else if (cUpper == '8') return "1000";
else if (cUpper == '9') return "1001";
else if (cUpper == 'A') return "1010";
else if (cUpper == 'B') return "1011";
else if (cUpper == 'C') return "1100";
else if (cUpper == 'D') return "1101";
else if (cUpper == 'E') return "1110";
else if (cUpper == 'F') return "1111";
else return "0000";
}
string HexToBin(const string& hex) {
string bin;
for (unsigned i = 0; i != hex.length(); ++i) {
bin += HexCharToBin(hex[i]);
}
return bin;
}
Код в C ++:
cout << HexToBin("152F302436152F302435152F302434152F302433152F302433") << endl;
//Outputs: 00010101001011110011000000100100001101100001010100101111001100000010010000110101000101010010111100110000001001000011010000010101001011110011000000100100001100110001010100101111001100000010010000110011
Я хочу, чтобы C ++ получал ту же строку, что и PHP. Что я здесь не так делаю?
Если вы просто хотите преобразовать шестнадцатеричное число в двоичное число, используйте base_convert()
.
Прочитайте hex2bin
PHP документация осторожно цитирует:
предосторожность
Эта функция НЕ преобразует шестнадцатеричное число в двоичное число. Это можно сделать с помощью функции base_convert ().
Эта функция просто
Декодирует шестнадцатерично закодированную двоичную строку.
Таким образом, поскольку ваша строка не является шестнадцатеричной строкой, вы получаете неожиданный / другой вывод.
Чтобы повторить поведение PHP hex2bin
следующий пост может помочь вам: Отсутствует пунктуация в C ++ hex2bin
Надеюсь, это помогло.
<?php
$HEXString = "152F302436152F302435152F302434152F302433152F302433";
echo base_convert(hex2bin($HEXString), 16, 2);
?>
Я думаю, что этот подход вернул бы то, что вы ищете,
или вы можете просто сделать ту же функцию, которую вы сделали на C ++ на PHP, используя Array, такую:
$base = array(
'1'=>"0001",
'2'=>"0010",
'3'=>"0011",
...
);
function HexToBin($string) {
$len = strlen($string);
$bin;
for ($i = 0; $i < $len; $i++) {
$bin += $base[$string[$i]];
}
return $bin;
}
echo HexToBin("152F302436152F302435152F302434152F302433152F302433");
//Outputs: 00010101001011110011000000100100001101100001010100101111001100000010010000110101000101010010111100110000001001000011010000010101001011110011000000100100001100110001010100101111001100000010010000110011
Я хочу, чтобы C ++ получал ту же строку, что и PHP. Что я делаю
здесь не так?
что делать, если вы знаете, что вывод PHP является неправильным выводом, и это не так, а в PHP, это нормальное поведение HEX2BIN функция.
вам нужно сначала конвертировать hex string
в десятичное значение с помощью HexDec и после этого преобразуйте ваш десятичный в двоичную, используя decbin .
$hex = decbin(
hexdec("152F302436152F302435152F302434152F302433152F302433")
);
echo $bin;
это вызовет проблему из-за Целочисленное ограничение PHP
на странице руководства decbin вы можете перейти к Раздел параметров узнать больше об этом.
Вы можете написать функцию PHP для достижения того же результата, что и на стороне C ++, или использовать расширение GMP, чтобы получить вывод пробника из приведенного выше примера.
function _hex2bin($hex)
{
$hex = strtoupper($hex);
$hexLen = strlen($hex);
$bin = [];
for ($i = 0; $i < $hexLen; $i++) {
$char = $hex[$i];
if ($char == '0') $bin[] = "0000";
else if ($char == '1') $bin[] = "0001";
else if ($char == '2') $bin[] = "0010";
else if ($char == '3') $bin[] = "0011";
else if ($char == '4') $bin[] = "0100";
else if ($char == '5') $bin[] = "0101";
else if ($char == '6') $bin[] = "0110";
else if ($char == '7') $bin[] = "0111";
else if ($char == '8') $bin[] = "1000";
else if ($char == '9') $bin[] = "1001";
else if ($char == 'A') $bin[] = "1010";
else if ($char == 'B') $bin[] = "1011";
else if ($char == 'C') $bin[] = "1100";
else if ($char == 'D') $bin[] = "1101";
else if ($char == 'E') $bin[] = "1110";
else if ($char == 'F') $bin[] = "1111";
else $bin[] = "0000";
}
return implode("", $bin);
}
echo _hex2bin("152F302436152F302435152F302434152F302433152F302433");
живой образец: https://3v4l.org/IkRmG
или даже короче
function _hex2bin($hex)
{
$hex = strtoupper($hex);
$hexLen = strlen($hex);
$bin = [];
for ($i = 0; $i < $hexLen; $i++) {
$char = $hex[$i];
$bin[] = str_pad(base_convert($char, 16, 2), 4, '0', STR_PAD_LEFT);
}
return implode("", $bin);
}
echo _hex2bin("152F302436152F302435152F302434152F302433152F302433");
живой образец: https://3v4l.org/MoH8R