hex2bin

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

hex2binПреобразовывает шестнадцатеричные данные в двоичные

Описание

hex2bin(string $string): string|false

Декодирует строку данных из шестнадцатеричного представления.

Предостережение

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

Список параметров

string

Шестнадцатеричное представление данных.

Возвращаемые значения

Возвращает двоичное представление данных или false, если возникла ошибка.

Ошибки

Если во входной шестнадцатеричной строке окажется нечётное число байт или она не является правильной шестнадцатеричной строкой, будет выдано предупреждение E_WARNING.

Примеры

Пример #1 Пример использования hex2bin()

<?php
$hex
= hex2bin("d0bfd180d0b8d0bcd0b5d18020d188d0b5d181d182d0bdd0b0d0b4d186d0b0d182d0b5d180d0b8d187d0bdd18bd18520d0b4d0b0d0bdd0bdd18bd185");
var_dump($hex);
?>

Вывод приведённого примера будет похож на:

string(60) "пример шестнадцатеричных данных"

Смотрите также

  • bin2hex() - Преобразовывает бинарные данные в шестнадцатеричное представление
  • unpack() - Распаковать данные из бинарной строки

add a note

User Contributed Notes 13 notes

up
40
Anonymous
12 years ago
The function hex2bin does not exist in PHP5.
You can use 'pack' instead :

$binary_string = pack("H*" , $hex_string);
up
5
nino at re-gister dot com
2 years ago
if you want to convert a hex encoded string to a binary string without any notices/errors regardless of the input, use this function:

<?php

function hex2binary($str)
{
return
ctype_xdigit(strlen($str) % 2 ? "" : $str) ? hex2bin($str) : false;
}

hex2binary(""); // false
hex2binary("a"); // false
hex2binary("ab"); // binary-string

?>

if the return type is string, you have your binary-string. otherwise (bool) false.
up
5
Anonymous
12 years ago
The function pack("H*" , $hex_string); will not work as expected if $hex_string contains an odd number of hexadecimal digits.

For example:

<?php echo ord(pack("H*", 'F')); ?>

will return 240 not 15. Use pack("H*", '0F'); instead.
up
4
jannik [dot] zappe [at] udo [dot] edu
10 years ago
I modified the function by Johnson a bit so it can be used as a drop-in-replacement. You don't need to worry about upgrading php because when it is upgraded, it will use the build in function.

<?php
if ( !function_exists( 'hex2bin' ) ) {
function
hex2bin( $str ) {
$sbin = "";
$len = strlen( $str );
for (
$i = 0; $i < $len; $i += 2 ) {
$sbin .= pack( "H*", substr( $str, $i, 2 ) );
}

return
$sbin;
}
}
?>
up
0
stanliwise at gmail dot com
1 year ago
#error:
hex2bin(): Hexadecimal input string must have an even length

For those who are facing the error above trying to convert hex to bin. you can pad your hex string with initial 0 before hex2bin.

function hexPad(string $hex_string)
{
$st_l = strlen($hex_string);
return str_pad($hex_string, $st_l + ($st_l % 2), '0', STR_PAD_LEFT);
}

hexPad('1bc') -> '01bc';

for usage hex2bin(hexPad('1bc'));
up
0
omer dot lakraa at hotmail dot fr
4 years ago
If you want to convert hex to GUID format (In my case, it was to convert GUID from MSSQL database) :

<?php
function hex2Guid($hex)
{
$hex = [
substr($hex, 0, 8),
substr($hex, 8, 4),
substr($hex, 12, 4),
substr($hex, 16, 4),
substr($hex, 20),
];

$order[0] = [6, 7, 4, 5, 2, 3, 0, 1];
$order[1] = [2, 3, 0, 1];
$order[2] = [2, 3, 0, 1];
$order[3] = [0, 1, 2, 3];
$order[4] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];

$result = "";

for(
$num = 0; $num < count($order); $num++)
{
for(
$i = 0; $i < count($order[$num]); $i++)
{
$result .= $hex[$num][$order[$num][$i]];
}

if(
$num != count($order) -1)
{
$result .= "-";
}
}

return
strtoupper($result);
}

Example :
echo
hex2Guid("64d3938b7008cd4bad5ffe56755d163f");

// return 8B93D364-0870-4BCD-AD5F-FE56755D163F
up
0
carschrotter at gmail dot com
10 years ago
Case of an incomplete hex string following function may help:
<?php
function make2validhex($data){
$data = (string) $data;
$len = strlen($data);
if(
$len % 2) {
return
substr($data, 0, $len -1);
}
return
$data;
}
?>
test:
<?php
$string
="not complete";
echo
$string;
echo
PHP_EOL;
$hex = bin2hex($string); //"6e6f7420636f6d706c657465"
echo $hex;
echo
PHP_EOL;
$deff = substr ($hex, 0, strlen($hex) -1);//"6e6f7420636f6d706c65746"
echo $deff;
echo
PHP_EOL;
echo
hex2bin(make2validhex($deff)); //"not complet"
echo PHP_EOL;
?>
up
-1
Johnson
11 years ago
For those who have php version prior to 5.4, i have a solution to convert hex to binary. It works for me in an encryption and decryption application.

<?php
function hextobin($hexstr)
{
$n = strlen($hexstr);
$sbin="";
$i=0;
while(
$i<$n)
{
$a =substr($hexstr,$i,2);
$c = pack("H*",$a);
if (
$i==0){$sbin=$c;}
else {
$sbin.=$c;}
$i+=2;
}
return
$sbin;
}
?>
up
-1
iradu at unix-world dot org
8 years ago
$test = bin2hex('sample ...');
echo _hex2bin($test);

// another hex2bin replacement
function _hex2bin($result) {
$out = '';
for($c=0;$c<strlen($result);$c+=2) {
$out .= chr(hexdec($result[$c].$result[$c+1]));
} //end for
return (string) $out;
}
up
-2
walf
10 years ago
A drop-in hex2bin emulator which behaves just like the the one in v5.5.1.

<?php
if (!function_exists('hex2bin')) {
function
hex2bin($data) {
static
$old;
if (
$old === null) {
$old = version_compare(PHP_VERSION, '5.2', '<');
}
$isobj = false;
if (
is_scalar($data) || (($isobj = is_object($data)) && method_exists($data, '__toString'))) {
if (
$isobj && $old) {
ob_start();
echo
$data;
$data = ob_get_clean();
}
else {
$data = (string) $data;
}
}
else {
trigger_error(__FUNCTION__.'() expects parameter 1 to be string, ' . gettype($data) . ' given', E_USER_WARNING);
return;
//null in this case
}
$len = strlen($data);
if (
$len % 2) {
trigger_error(__FUNCTION__.'(): Hexadecimal input string must have an even length', E_USER_WARNING);
return
false;
}
if (
strspn($data, '0123456789abcdefABCDEF') != $len) {
trigger_error(__FUNCTION__.'(): Input string must be hexadecimal string', E_USER_WARNING);
return
false;
}
return
pack('H*', $data);
}
}
?>
up
-5
jarismar dot php at gmail dot com
11 years ago
A way to convert hex strings in the form "0x123ABC" to integer is to use the function base_convert("0x123ABC", 16, 10)
up
-3
JLovrek
6 years ago
replace

function Hex2Bin($data) {
$BinData = "";
for ($i=0;$i<strlen($data);$i+=2)
$BinData .= chr( HexDec( substr($data,$i,2) ) );
return $BinData;

With

function hextobin($hexstr)
{
$n = strlen($hexstr);
$sbin="";
$i=0;
while($i<$n)
{
$a =substr($hexstr,$i,2);
$c = pack("H*",$a);
if ($i==0){$sbin=$c;}
else {$sbin.=$c;}
$i+=2;
}
return $sbin;
up
-25
EM
9 years ago
Ran into an interesting case with hex2bin and php5.5.12 while upgrading from 5.3.3 -> 5.5.12

The previous code had redeclared the hex2bin function with the $binary_string = pack("H*" , $hex_string) trick.

php5.5.12 would have none of that. The solution, albeit a hacky one, was doing a find an replace of hex2bin to 'hex3bin' for the whole site directory.
To Top