hex2bin

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

hex2binDecodes a hexadecimally encoded binary string

Description

hex2bin(string $string): string|false

Decodes a hexadecimally encoded binary string.

Caution

This function does NOT convert a hexadecimal number to a binary number. This can be done using the base_convert() function.

Parameters

string

Hexadecimal representation of data.

Return Values

Returns the binary representation of the given data or false on failure.

Errors/Exceptions

If the hexadecimal input string is of odd length or invalid hexadecimal string an E_WARNING level error is thrown.

Examples

Example #1 hex2bin() example

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

The above example will output something similar to:

string(16) "example hex data"

See Also

  • bin2hex() - Convert binary data into hexadecimal representation
  • unpack() - Unpack data from binary string

add a note add a note

User Contributed Notes 11 notes

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

$binary_string = pack("H*" , $hex_string);
up
2
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
6
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
2
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
0
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
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
-2
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
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
-6
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
-24
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