【问题标题】:Convert hex to ascii characters将十六进制转换为 ASCII 字符
【发布时间】:2011-11-21 06:12:32
【问题描述】:

是否可以用0-9a-zA-Z字符的序列来表示一个十六进制字符(0-9A-F)的序列,所以结果序列更小,可以解码?

例如:

$hex = '5d41402abc4b2a76b9719d911017c592';
echo $string = encode($hex); // someASCIIletters123
echo decode(string) == $hex; //true

【问题讨论】:

  • 我认为他的意思是把 2 个(4 字节)十六进制数字塞进一个字节(应该可以的)
  • 看起来你刚刚重新发明了 base64...嗯,base62,但如果我是你,我会选择众所周知且到处支持的 base64。
  • @Robik。我认为 zie 的意思是将 16 基转为 62 基。基数越高,字符串越短,因此“结果序列”确实会“更小”。 62 位字符是 0-9a-zA-Z。不错的概念,但我不知道有什么简单的方法。

标签: php encoding decoding


【解决方案1】:

内置的 php 函数可能会帮助一些人登陆这里进行搜索:

// https://www.php.net/manual/en/function.hex2bin
$hex = '6578616d706c65206865782064617461';
echo hex2bin($hex); // example hex data

【讨论】:

    【解决方案2】:

    我想你正在寻找这个:

    function hex2str($hex) {
        $str = '';
        for($i=0;$i<strlen($hex);$i+=2) $str .= chr(hexdec(substr($hex,$i,2)));
        return $str;
    }
    

    (来自http://www.linux-support.com/cms/php-convert-hex-strings-to-ascii-strings/) (像这个 javascript 工具一样工作:http://www.dolcevie.com/js/converter.html

    【讨论】:

      【解决方案3】:

      嗯,有些东西类似,是的...将十六进制字符解析为二进制值,然后转换为base64。这比 0-9 a-z A-Z 使用了 little 位,但只使用了几个字符。除了这 62 个字符之外,您还可以使用其他三个字符吗?如果是这样,您可以使用base64_encode 执行编码。

      (您可以改为转换为 base32,但这不会那么紧凑。转换为不是 2 的幂的基数也是可行的,但吸引力较小。)

      如果您的输入序列有奇数个字符,您还需要某种方式来表示最后一个半字节。在调用 pack 进行原始解析之前,您可能需要考虑一下...

      【讨论】:

      • @fvu:第 65 个字符是等号,它可能只出现在编码字符串的末尾。谷歌编码方法,看看你为什么需要它。
      • @jon ahhh,您指的是在许多 b64 变体中强制使用的填充字符。他也可以选择例如 RFC4648、Nmtoken 或 Name 并节省 1 个字节
      • @fvu:是的,可能。使用“标准”base64 的好处是它更容易移植到其他平台。通常需要查找 64 个字符和需要查找 65 个字符之间的区别并不显着。
      • @fvu:但是,base64_encode 内置于 PHP 和许多其他语言中,这几乎决定了我们每个人都会选择什么。
      【解决方案4】:

      您的意思是要将一串十六进制数字转换为实际的十六进制值?

      $hex_string = "A1B2C3D4F5"; // 10 chars/bytes
      $packed_string = pack('H*', $hex_string); // 0xA1B2C3D4F5 // 5 chars/bytes.
      

      【讨论】:

        【解决方案5】:

        您可以使用函数base_convert_arbitrary 轻松调整我提出的解决方案here

        编辑:我没有仔细阅读 :) Base 16 到 base 62 仍然非常可行,如上所述。

        See it in action.

        【讨论】:

        • 最好有一个不依赖于您的其他解决方案的解决方案
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-22
        • 1970-01-01
        • 2014-11-16
        • 1970-01-01
        • 2017-03-11
        • 1970-01-01
        • 2011-06-14
        相关资源
        最近更新 更多