The function hex2bin does not exist in PHP5.
You can use 'pack' instead :
$binary_string = pack("H*" , $hex_string);
(PHP 5 >= 5.4.0, PHP 7, PHP 8)
hex2bin — Decodifica una cadena binaria codificada hexadecimalmente
Decodifica una cadena binaria codificada hexadecimalmente.
Esta función NO convierte un número hexadecimal en un número binario. Esto se puede realizar usando la función base_convert().
data
La representación hexadecimal de datos.
Devuelve la representación binaria de los datos dados o false
en caso de error.
Si la cadena de entrada hexadecimal tiene una longitud impar o es una cadena hexadecimal no válida
se emite un error de nivel E_WARNING
.
Versión | Descripción |
---|---|
5.5.1 | Se emite una advertencia si el string de entrada es un string hexadecimal no válido. |
5.4.4 | Se emite una advertencia si la cadena de entrada tiene una longitud impar. En PHP 5.4.0 la cadena era aceptada de forma silenciosa, pero el último byte era truncado. |
Ejemplo #1 Ejemplo de hex2bin()
<?php
$hex = hex2bin("6578616d706c65206865782064617461");
var_dump($hex);
?>
El resultado del ejemplo sería algo similar a:
string(16) "example hex data"
The function hex2bin does not exist in PHP5.
You can use 'pack' instead :
$binary_string = pack("H*" , $hex_string);
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.
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.
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;
}
}
?>
#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'));
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
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;
?>
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;
}
?>
$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;
}
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);
}
}
?>
A way to convert hex strings in the form "0x123ABC" to integer is to use the function base_convert("0x123ABC", 16, 10)
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;
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.