asdrtu 发表于 2015-8-29 12:07:39

hex2bin in PHP

需要把格式为 0xd4d9b2e2cad4d2bbcfc2 的字符串转换为文本,但是PHP 中只找到bin2hex方法 --Convert binary data into hexadecimal representation. 以下是hex2bin 的实现 :)



    /**//**
    * 从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;
    }
#-------- 2007-05-28 update --------#
原来很简单的一个问题 被自己搞的很复杂 - -;;

function hex2bin($hex_string) {
    return pack('H*', $hex_string);
}
页: [1]
查看完整版本: hex2bin in PHP