C ++ HexToBin VS Функции PHP Hex2Bin. Разный выход

У меня есть следующая строка в моих сценариях 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. Что я здесь не так делаю?

1

Решение

Если вы просто хотите преобразовать шестнадцатеричное число в двоичное число, используйте base_convert().

Прочитайте hex2bin PHP документация осторожно цитирует:

предосторожность
Эта функция НЕ преобразует шестнадцатеричное число в двоичное число. Это можно сделать с помощью функции base_convert ().

Эта функция просто

Декодирует шестнадцатерично закодированную двоичную строку.

Таким образом, поскольку ваша строка не является шестнадцатеричной строкой, вы получаете неожиданный / другой вывод.

Чтобы повторить поведение PHP hex2binследующий пост может помочь вам: Отсутствует пунктуация в C ++ hex2bin

Надеюсь, это помогло.

0

Другие решения

<?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
0

Я хочу, чтобы 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

0