文字

hex2bin

(PHP >= 5.4.0)

hex2bin转换十六进制字符串为二进制字符串

说明

string hex2bin ( string $data )

转换十六进制字符串为二进制字符串。

Caution

这个函数不是 转换十六进制数字为二进制数字。这种转换可以使用 base_convert() 函数。

参数

data

十六进制表示的数据

返回值

返回给定数据的二进制表示 或者在失败时返回 FALSE

错误/异常

如果输入的十六进制字符串是奇数长数或者无效的十六进制字符串将会抛出 E_WARNING 级别的错误。

更新日志

版本 说明
5.5.1 如果输入的字符串是无效的十六进制字符串则抛出一个警告,
5.4.4 如果输入的字符串有多余将抛出异常。 PHP 5.4.0 起字符串将被静默地接受,但是最后的字节会被截断。

范例

Example #1 hex2bin() 例子

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

以上例程的输出类似于:

string(16) "example hex data"

参见

  • bin2hex() - 函数把ASCII字符的字符串转换为十六进制值
  • unpack() - Unpack data from binary string

用户评论:

[#1] EM [2014-06-11 22:14:01]

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.

[#2] carschrotter at gmail dot com [2013-11-01 02:19:16]

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($data0$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 ($hex0strlen($hex) -1);//"6e6f7420636f6d706c65746"
echo $deff;
echo 
PHP_EOL;
echo 
hex2bin(make2validhex($deff)); //"not complet"
echo PHP_EOL;
?>

[#3] walf [2013-10-16 04:41:35]

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);
    }
}
?>

[#4] jannik [dot] zappe [at] udo [dot] edu [2013-08-23 12:00:56]

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 += ) {
            
$sbin .= pack"H*"substr$str$i) );
        }

        return 
$sbin;
    }
}
?>

[#5] Johnson [2013-01-01 12:23:57]

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;
    }
?>

[#6] jarismar dot php at gmail dot com [2012-12-17 13:13:03]

A way to convert hex strings in the form "0x123ABC" to integer is to use the function base_convert("0x123ABC", 16, 10)

[#7] Anonymous [2012-02-23 02:28:43]

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.

[#8] Anonymous [2011-08-31 01:32:41]

The function hex2bin does not exist in PHP5.
You can use 'pack' instead :

$binary_string = pack("H*" , $hex_string);

上一篇: 下一篇: