时间:2021-07-01 10:21:17 帮助过:11人阅读
/**/ /**
* 从16进制字符串中的两个字符返回一个byte
* @param $str - 包含字符的字符串
* @param $start - 第一个字符的位置
* @return string 分析后的byte
* @throw Exception
*/
private static function _FromHexPair($str,$start = 0 )
{
$c1 = $str[$start]; //取第一个字符
$c2 = $str[$start + 1]; //第二个
$c1 = ord($c1);
$c2 = ord($c2);
//字符对应的值
$i1;
$i2;
//$c1=>$i1
if($c1>=ord('0')&& $c1<=ord('9'))
$i1 =$c1-ord('0');
else if($c1>=ord('A')&&$c1<=ord('F'))
$i1 =$c1-ord('A')+10;
else if($c1>=ord('a')&&$c1<=ord('f'))
$i1 =$c1-ord('a')+10;
else throw new exception("unexpected char 1:" . $c1 . " @ " . $start);
//$c2=>$i2
if($c2>=ord('0')&&$c2<=ord('9'))
$i2 =$c2-ord('0');
else if($c2>=ord('A')&&$c2<=ord('F'))
$i2 =$c2-ord('A')+10;
else if($c2>=ord('a')&&$c2<=ord('f'))
$i2 =$c2-ord('a')+10;
else throw new exception("unexpected char 2:" . $c2 . " @ " . ($start+1));
return chr(($i1<<4) + $i2); //返回$i1*16+$i2
}
/**/ /**
* 把十六进制字符串转换成文本字符串
* @param $str - 要转换的字符串,不能为null.
* @return string
* @throw Exception
*/
public static function hex2bin($str)
{
//判断长度
if((strlen($str)%2) != 0 )
throw new exception("str.Length % 2 != 0");
//计算byte[]的长度
$len = strlen($str)/2;
$str_result = '';
//循环复制
for($i=0;$i<$len;$i++)
{
$str_result .= self::_FromHexPair($str,$i*2);
}
return $str_result;
}
function hex2bin( $hex_string ) {
return pack ( ' H* ' , $hex_string );
}