bin2hex

(PHP 4, PHP 5, PHP 7, PHP 8)

bin2hexConvertit des données binaires en représentation hexadécimale

Description

bin2hex(string $string): string

Retourne la chaîne string dont tous les caractères sont représentés par leur équivalent hexadécimal. La chaîne retournée est une chaîne ASCII. La conversion supporte les caractères binaires, et utilise les bits de poids forts en premier.

Liste de paramètres

string

Une chaîne de caractères.

Valeurs de retour

Retourne la représentation hexadécimale de la chaîne fournie.

Exemples

Exemple #1 Exemple avec bin2hex()

<?php

$hex
= bin2hex('Hello world!');

var_dump($hex);
var_dump(hex2bin($hex));
?>

L'exemple ci-dessus va afficher :

string(24) "48656c6c6f20776f726c6421"
string(12) "Hello world!"

Voir aussi

  • hex2bin() - Convertit une chaîne encodée en hexadécimal vers du binaire
  • pack() - Compacte des données dans une chaîne binaire

add a note add a note

User Contributed Notes 23 notes

up
52
tehjosh at gamingg dot net
16 years ago
This function is for converting binary data into a hexadecimal string representation.  This function is not for converting strings representing binary digits into hexadecimal.  If you want that functionality, you can simply do this:

<?php
$binary
= "11111001";
$hex = dechex(bindec($binary));
echo
$hex;
?>

This would output "f9".  Just remember that there is a very big difference between binary data and a string representation of binary.
up
9
j_lozinskit at yahoo dot co dot uk
19 years ago
A good option for creating strings with binary data for saving (for example saving an sql statement to a file) into text files or php code is to do the following:

<?php
$field
=bin2hex($field);
$field=chunk_split($field,2,"\\x");
$field= "\\x" . substr($field,0,-2);
?>

this will convert your field (binary or not) into hex and then convert the hex into a string which may be placed in a php file:

FFFFFFFF -> \xFF\xFF\xFF\xFF
up
1
t0rus at dr dot com
19 years ago
modified version of Thoth's hexbin and binhex to convert
any size numbers
(original doesn't take more than integer - 32bit)
<?
function hexbin($hex){
    $bin='';
    for($i=0;$i<strlen($hex);$i++)
        $bin.=str_pad(decbin(hexdec($hex{$i})),4,'0',STR_PAD_LEFT);
       return $bin;
}

function binhex($bin){
    $hex='';
    for($i=strlen($bin)-4;$i>=0;$i-=4)
        $hex.=dechex(bindec(substr($bin,$i,4)));
   return strrev($hex);
}
?>
up
6
mkr at binarywerks dot dk
20 years ago
Ok, this is a better version than my previous poor example.

Running this in shell creates a progress indicator. Very useful if used when parsing large log files for instance.

#!/usr/bin/php4 -q
<?
// Displays a progress indicator
function progress($line)
{
        global $last_len;

        $del_char = pack("H" . 2, "7F");
        $line_len = strlen($line);
        $del_chars=(isset($last_len)) ? $last_len : $line_len;

        $last_len = $line_len;
        return str_repeat($del_char, ($del_chars)).$line;
}

// demo code:
for($i=0;$i<100;$i++)
{
        sleep(1);
        echo progress("i is now: $i out of 100");
}
?>
up
7
manithu at fahr-zur-hoelle dot org
19 years ago
This function returns the string $str in htmlentity hex format (&#xnumber;).
It is useful to prevent spam bots indexing your email adress.

<?php

function hexentities($str) {
   
$return = '';
    for(
$i = 0; $i < strlen($str); $i++) {
       
$return .= '&#x'.bin2hex(substr($str, $i, 1)).';';
    }
    return
$return;
}

?>

example:
<?php echo 'email: <address>'.hexentities('foo@bar').'</address>'; ?>
will return:

email: <address>&#x66;&#x6f;&#x6f;&#x40;&#x62;&#x61;&#x72;</address>

the browser will show foo@bar.
up
3
tightcode at hotmail dot com
22 years ago
I was just browsing the above and with a little modification,
came up with the following which I believe to be more flexible:

<?php
function bin2hex($data) {
   
$corrected = ereg_replace("[^0-9a-fA-F]","",$data);
    return
pack("H".strlen($corrected),$corrected);
}
?>

This will make sure that whatever you pass, even if it is padded
at the extremeties or between pairs, should return the desired data.
up
2
kissifrot at gmail dot com
16 years ago
hex2bin can be useful to insert data into BLOB binary fields.

for example if you want to insert the content of a file :

<?php
$filename
= '/foo/bar';
$bin_content = fread(fopen($filename,"r"),filesize($filename));

// use the usual mysql_connect() function

$insert_query = "INSERT INTO mytable (blob_field) VALUES ('".bin2hex($bin_content)."')";
mysql_query($insert_query);

?>
up
1
busuioc dot alexandru at gmail dot com
4 years ago
Convenient way of generating API keys

<?php
$apikey
= bin2hex(random_bytes(32)); // generates 64 characters long string /^[0-9a-f]{64}$/
?>
up
4
chaos79
15 years ago
Because the way back (hex2bin) doesn't exist on php, i've written another little function without using commands like pack:

<?php
// Convert a hex-string to binary-string (the way back from bin2hex)

function hex2bin($h)
  {
  if (!
is_string($h)) return null;
 
$r='';
  for (
$a=0; $a<strlen($h); $a+=2) { $r.=chr(hexdec($h{$a}.$h{($a+1)})); }
  return
$r;
  }

echo
bin2hex('Hello'); // result: 48656c6c6f
echo hex2bin('48656c6c6f'); // result: Hello
?>
up
3
me at juanmaria dot com
14 years ago
Regarding the fabled hex2bin, the easiest way I've found to "replace" it is the following call to function pack():

<?php
$bin_str
= pack("H*" , $hex_str);   
?>
up
1
subdivizion at gmail dot com
14 years ago
Here's a function to check if a string contains any 7-bit GSM characters.

It might come useful for people working on SMS platforms.

<?php

function check_gsm($str)
{
   
$arr = array(
"0x00", "0x01", "0x02", "0x03", "0x04", "0x05","0x06","0x07","0x08","0x09",
"0x0A","0x0B","0x0C","0x0D","0x0E","0x0F","0x10","0x11","0x12","0x13",
"0x14","0x15","0x16","0x17","0x18","0x19","0x1A","0x1B","0x1B0A",
"0x1B14","0x1B28","0x1B29","0x1B2F","0x1B3C","0x1B3D","0x1B3E",
"0x1B40","0x1B65","0x1C","0x1D","0x1E","0x1F","0x20","0x21","0x22",
"0x23","0x24","0x25","0x26","0x27","0x28","0x29","0x2A","0x2B","0x2C",
"0x2D","0x2E","0x2F","0x30","0x31","0x32","0x33","0x34","0x35","0x36",
"0x37","0x38","0x39","0x3A","0x3B","0x3C","0x3D","0x3E","0x3F","0x40",
"0x41","0x42","0x43","0x44","0x45","0x46","0x47","0x48","0x49","0x4A",
"0x4B","0x4C","0x4D","0x4E","0x4F","0x50","0x51","0x52","0x53","0x54",
"0x55","0x56","0x57","0x58","0x59","0x5A","0x5B","0x5C","0x5D","0x5E",
"0x5F","0x60","0x61","0x62","0x63","0x64","0x65","0x66","0x67","0x68",
"0x69","0x6A","0x6B","0x6C","0x6D","0x6E","0x6F","0x70","0x71","0x72",
"0x73","0x74","0x75","0x76","0x77","0x78","0x79","0x7A","0x7B","0x7C",
"0x7D","0x7E","0x7F");

   
$strl = strlen($str);
    for (
$i = 0;$i < $strl; $i++)
    {
       
$char = '0x' . bin2hex(substr($str,$i,1));
       
$pos = in_array($char,$arr);
        if (
$pos == 1)
        {
           
$j++;
        }
    }

    if (
$j < $strl)
    {
        return
false;
    }
    else
    {
        return
true;
    }
}
?>
up
1
Thoth
20 years ago
I thought it'll give me an "F" if i give it a "1111"...

Here's something to convert a binary-string into a hex-string and other direction too:

<?php
function hexbin($hex) {
   
$bin = decbin(hexdec($hex));
    return
$bin;
}

function
binhex($bin) {
   
$hex = dechex(bindec($bin));
    return
$hex;
}
?>

simple, isn't it?
up
2
pedram at redhive dot com
23 years ago
In an attempt to dodge spam bots I've seen people (including myself) hex encode their email addresses in "mailto" tags. This is the small chunk of code I wrote to automate the process:

<?php
function hex_encode ($email_address)    {
       
$encoded = bin2hex("$email_address");
       
$encoded = chunk_split($encoded, 2, '%');
       
$encoded = '%' . substr($encoded, 0, strlen($encoded) - 1);
        return
$encoded;   
}
?>

so for example:
<a href="mailto:&lt;?=hex_encode("pedram@redhive.com")?>">email me</a>

would produce the following address:
%70%65%64%72%61%6d%40%72%65%64%68%69%76%65%2e%63%6f%6d

-pedram
up
0
brams006 at umn dot edu
19 years ago
Here's a modified version of an earlier post (asc2bin and bin2asc) to convert an incoming ascii string to hex and out again.  For example, this is really useful if you want to insert data into a mySQL database which contains both escaped and non-escaped characters.  For example, if you want to store code snibbets in a mySQL text field:

printf("here's some \"text\".");

If you INSERT this into mySQL, it probably won't come out in friendly executable format, and you can't escape all double-quotes, nor can you strip out all the slashes.  One solution is to just convert the string to hex, store it in hex, then convert back to ascii before using it in some way:

function asc2hex ($temp) {
   $len = strlen($temp);
   for ($i=0; $i<$len; $i++) $data.=sprintf("%02x",ord(substr($temp,$i,1)));
   return $data;
}

function hex2asc($temp) {
   $len = strlen($temp);
   for ($i=0;$i<$len;$i+=2) $data.=chr(hexdec(substr($temp,$i,2)));
   return $data;
}
up
0
mhspam at mail dot sce dot cz
19 years ago
My version of quoted-printable mail subject converting function (maybe not as effective, but preserving characters which don't need conversion).
Martin
<?php
// Transfer mail subject into Quoted Printable encoding
function mail_quote_subj($str, $charset){
   
$out = '';
    for(
$i = 0; $i < strlen($str); $i++){
       
$out .= (ord($str[$i]) > 127) ? "=" . bin2hex($str[$i]) : $str[$i];
    }
    return
"=?$charset?Q?".$out."?=";
};
?>
up
0
AntonioAlcorn at yahoo dot coma
19 years ago
In response to Patrik:
A simpler way to print a number in binary is to use base_convert().
<? echo base_convert($bin, 10, 2); ?>
If you need it to print all 32 bits (as your function does) you can just pad it out:
<? echo str_pad(base_convert($bin, 10, 2), 32, '0', STR_PAD_LEFT); ?>
The conversion is from base 10 because when $bin is passed to base_convert(), it is converted to a string, and the default representation is in decimal.
Hope this helps.
up
0
Francisco (ffaria at mutua dot com dot br)
20 years ago
function to search a character in a normal string change this for a hexadecimal and take the especifical char code in hexa and replace this char and return the string

<?php
function hex_replace($pCaracter,$sCaracter,$conteudo) {
   
   
$pHex = bin2hex($pCaracter);
   
$sHex = bin2hex($sCaracter);
       
   
$tam = strlen($conteudo);   
       
    for(
$i = 0; $i <= $tam; $i++) {
       
$cont = bin2hex(substr($conteudo,$i,1));
  
        if (
$cont == $pHex) {
          
$cont = $sHex;
          
$hex .= $cont;
        }
    }
       
    for (
$i=0;$i<strlen($hex);$i+=2)
         
$bin .= chr(hexdec(substr($hex,$i,2)));
    return
$bin;
}
?>

by from a litle brazilian. :-P
up
-1
admin at tsunaquack dot com
21 years ago
Some gave a function to convert a hex code back into a simple text (human readable ASCII :P)

Some else gave a function that makes use of bin2hex to convert URLs into something like %12%34%56

Here is a function to go from the form %12%34%56 back into ASCII

Note that this function can easily be changed in order to transform any hex code into ASCII

<?
function _hex2text($str) {
    $str = explode('%', $str);
    array_shift($str);
    $nmlstr = '';
    foreach($str as $hexstr) {
      $nmlstr .= chr(base_convert($hexstr, 16, 10));
    }   
    return $nmlstr;
}
?>

'hope this helps :)
Regards
-Tsuna
up
-1
matthew dot eastman at hotpop dot com
21 years ago
This function undoes it (converts back into ASCII).

<?php
function hex2asc($myin) {
for (
$i=0; $i<strlen($myin)/2; $i++) {
$myout.=chr(base_convert(substr($myin,$i*2,2),16,10));
}
return
$myout;
}
?>
up
-1
matt at zevi dot net
21 years ago
Hopefully this helps someone...

It just displays an html representation of hex data, much like a hex viewer would.

Matt

<?php
function hexview($data){
 
$bytePosition = $columnCount = $lineCount = 0;
 
$columns = 8;
 
$dataLength = strlen($data);
 
$return = array();
 
$return[] = '<table border="1" cellspacing="0" cellpadding="2">';
  for(
$n = 0; $n < $dataLength; $n++){
   
$lines[$lineCount][$columnCount++] = substr($data, $n, 1);
    if(
$columnCount == $columns){
     
$lineCount++;
     
$columnCount = 0;
    }
  }
  foreach(
$lines as $line){
   
$return[] = '<tr><td align="right">'.$bytePosition.': </td>';
    for(
$n = 0; $n < $columns; $n++){
     
$return[] = '<td>'.strtoupper(bin2hex($line[$n])).'</td>';
    }
   
$return[] = '<td> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </td>';
    for(
$n = 0; $n < $columns; $n++){
     
$return[] = '<td>'.(htmlentities($line[$n]) ? htmlentities($line[$n]) : '&nbsp;').'</td>';
    }
   
$return[] = '</tr>';
   
$bytePosition = $bytePosition + $columns;
  }
 
$return[] = '</table>';
  return
implode('', $return);
}
?>
up
-2
Dave
9 years ago
Postgresql return result in bytea so don't forget to convert_from

<?php
$sql
= "SELECT convert_from(decode('". bin2hex('hex encoded string') ."', 'hex'),'UTF8')";
?>
up
-5
Patrik
20 years ago
I needed a little function that will print the binary as a string, here it comes.

<?php
function bin2string($bin) {
   
$res = "";
    for(
$p=31; $p >= 0; $p--) {
     
$res .= ($bin & (1 << $p)) ? "1" : "0";
    }
    return
$res;
}
?>
up
-16
admin at purespider dot de
15 years ago
The most simple way to do binary (10101010 or so) to hex is
<?PHP echo dechex(bindec(10101010)); ?>
To Top