【问题标题】:How to convert text to \x codes?如何将文本转换为 \x 代码?
【发布时间】:2011-11-11 08:10:39
【问题描述】:

我想将普通文本转换为 \x 代码,例如 \x14\x65\x60

例如:

normal text = "base64_decode"
converted \x codes for above text = "\x62\141\x73\145\x36\64\x5f\144\x65\143\x6f\144\x65"

如何做到这一点?提前致谢。

【问题讨论】:

    标签: php hex encode


    【解决方案1】:

    ord() 函数为您提供单个字节的十进制值。 dechex() 将其转换为十六进制。所以要做到这一点,循环遍历字符串中的每个字符并应用这两个函数。

    【讨论】:

      【解决方案2】:

      这是工作代码:

      function make_hexcodes($text) {
          $retval = '';
          for($i = 0; $i < strlen($text); ++$i) {
              $retval .= '\x'.dechex(ord($text[$i]));
          }
      
          return $retval;
      }
      
      echo make_hexcodes('base64_decode');
      

      See it in action.

      【讨论】:

      • @DaveRandom:为什么要垫?此外,string parsing rules 在这种特殊情况下不需要转义。您可以通过单击实时示例链接或阅读文档来亲自查看。
      • 因为任何小于 16 的字符都会导致,例如\xa 而不是 \x0a。想一想,我不知道这是否重要,我一直只是假设它重要。并转义你的反斜杠,因为它需要转义。在单引号字符串中它确实很重要,但它仍然是一个好习惯。
      • @DaveRandom:对不起,我不同意。文档很清楚不需要填充,'\x' 中的斜线不需要转义。
      • 您链接的页面在“单引号”部分明确说明:To specify a literal backslash, double it (\\)。 PHP 非常擅长理解您的意思,但是由于您仍然可以使用 \ 来指定文字单引号,因此从技术上讲,您应该转义反斜杠。
      • @DaveRandom:它继续:所有其他反斜杠实例将被视为文字反斜杠:这意味着您可能习惯的其他转义序列,例如 \r 或 \ n, 将按指定的字面意思输出,而不是具有任何特殊含义。我认为这不是“想出你想要什么”的问题:那些是记录在案的规则
      【解决方案3】:
      $str = 'base64_decode';
      $length = strlen($str);
      $result = '';
      
      for ($i = 0; $i < $length; $i++) $result .= '\\x'.str_pad(dechex(ord($str[$i])),2,'0',STR_PAD_LEFT);
      
      print($result);
      

      【讨论】:

      • str_pad 在这里是不需要的:它应该只匹配\x[0-9A-Fa-f]{1,2}
      【解决方案4】:

      PHP 5.3 单行:

      echo preg_replace_callback("/./", function($matched) {
          return '\x'.dechex(ord($matched[0]));
      }, 'base64_decode');
      

      输出\x62\x61\x73\x65\x36\x34\x5f\x64\x65\x63\x6f\x64\x65

      【讨论】:

      • 不适用于我的特殊字符串:base64_decode('OVUP/PZrLzoZpaeQga/TpK9xeJAOuTTbUzm9NplDuhSUMkklPtDeDQDgidUEIX+ijxe80EI')
      • 使用该字符串在我的计算机上运行良好。我不明白为什么它不能工作,除非你的 PHP 版本低于 5.3。
      • 对不起,这很好,结果与@DaveRandom 的略有不同。
      【解决方案5】:

      对于dechex(ord()) 的替代方案,您还可以使用bin2hex($char)sprintf('\x%02X')unpack('H*', $char)。此外,您可以将array_mapstr_split 一起使用,而不是使用preg_replace_callback

      echo implode(array_map(function($char) {
          return '\x' . bin2hex($char);
      }, (array) str_split($word)));
      
      echo implode(array_map(function($char) {
          return '\x' . implode(unpack('H*', $char));
      }, (array) str_split($word)));
      
      echo implode(array_map(function($char) {
          return sprintf('\x%02X', ord($char));
      }, (array) str_split($word)));
      

      示例:https://3v4l.org/6Pc6X

      bin2hex

      echo implode(array_map(function($char) {
          return '\x' . bin2hex($char);
      }, (array) str_split('base64_decode')));
      

      结果

      \x62\x61\x73\x65\x36\x34\x5f\x64\x65\x63\x6f\x64\x65
      

      解压

      echo implode(array_map(function($char) {
          return '\x' . implode(unpack('H*', $char));
      }, (array) str_split('base64_decode')));
      

      结果

      \x62\x61\x73\x65\x36\x34\x5f\x64\x65\x63\x6f\x64\x65
      

      sprintf

      echo implode(array_map(function($char) {
          return sprintf('\x%02X', ord($char));
      }, (array) str_split('base64_decode')));
      

      结果

      \x62\x61\x73\x65\x36\x34\x5f\x64\x65\x63\x6f\x64\x65
      

      【讨论】:

        【解决方案6】:

        我没有读过这段代码 \ud83d\udc33 ?

        function unicode_decode(string $str)
            {
               str="Learn Docker in 12 Minutes \ud83d\udc33"
                return preg_replace_callback('/u([0-9a-f]{4})/i', function ($match) {
                    return mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UCS-2BE');
                }, $str);
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-20
          • 2020-03-06
          • 2011-03-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多