©
本文档使用
php.cn手册 发布
(PHP >= 5.4.0)
hex2bin — 转换十六进制字符串为二进制字符串
$data
)转换十六进制字符串为二进制字符串。
这个函数不是 转换十六进制数字为二进制数字。这种转换可以使用 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"
[#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($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;
?>
[#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 += 2 ) {
$sbin .= pack( "H*", substr( $str, $i, 2 ) );
}
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);