PHP Unconference Europe 2015

hex2bin

(PHP >= 5.4.0)

hex2binDekodiert einen hexadezimal kodierten Binärstring

Beschreibung

string hex2bin ( string $data )

Dekodiert einen hexadezimal kodierten Binärstring.

Achtung

Diese Funktion konvertiert NICHT eine Hexadezimalzahl in eine Binärzahl. Dafür kann stattdessen die base_convert() Funktion verwendet werden.

Parameter-Liste

data

Hexadezimale Repräsentation von Daten.

Rückgabewerte

Gibt die binäre Repräsentation der Daten zurück Im Fehlerfall wird FALSE zurückgegeben..

Fehler/Exceptions

Falls die Länge des Eingabestrings ungerade ist, wird ein E_WARNING Fehler geworfen.

Changelog

Version Beschreibung
5.4.1 Wenn die Länge des Eingabestrings ungerade ist, wird ein Fehler geworfen. In PHP 5.4.0 wurde ein String ungerader Länge akzeptiert, jedoch wurde das letzte Byte abgeschnitten.

Beispiele

Beispiel #1 hex2bin() Beispiel

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

Das oben gezeigte Beispiel erzeugt eine ähnliche Ausgabe wie:

string(16) "example hex data"

Siehe auch

  • bin2hex() - Wandelt Binär-Daten in ihre hexadezimale Entsprechung um
  • unpack() - Entpackt die Daten eines Binär-Strings

add a note add a note

User Contributed Notes 8 notes

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

$binary_string = pack("H*" , $hex_string);
up
1
jannik [dot] zappe [at] udo [dot] edu
1 year 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
1
jarismar dot php at gmail dot com
1 year ago
A way to convert hex strings in the form "0x123ABC" to integer is to use the function base_convert("0x123ABC", 16, 10)
up
1
carschrotter at gmail dot com
11 months 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
0
Anonymous
2 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
-1
Johnson
1 year 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
1 year 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
-3
EM
4 months 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