【问题标题】:Methods for identifying encoding type using php使用php识别编码类型的方法
【发布时间】:2011-07-31 12:23:41
【问题描述】:

我有一个 PHP 字符串类型变量,它可能以十六进制模式或 Base64 编码。

例如:

737461636b6f766572666c6f772e636f6d
c3RhY2tvdmVyZmxvdy5jb20=

这两行的意思是stackoverflow.com,问题是我不知道哪个是 HEX 或 Base64,因为我不知道应用哪种解码方法。

是否可以在不知道编码文本的情况下确定编码方法?如果是的话,如何在php中做到这一点?

【问题讨论】:

  • 您可以猜测(如果存在除 0-9、A-F 以外的任何字符,则为 base-64),但 base-64 编码总是有可能看起来像十六进制,因为具体的数据值。

标签: php base64 hex decode


【解决方案1】:

仅通过查看字符串无法确定字符串是否为 Base64/HEX 格式。您必须在字符串中包含一个额外的位,指示它是哪一个,然后在您的代码中读取它并根据需要进行解码。

如果字符串在“F”之后包含一个字母,您可以确定它是 Base64,但它可能是 Base64,即使它不是,所以没有某种标题就无法确定在字符串告诉你编码是什么之前。

【讨论】:

    【解决方案2】:

    如果您只能保证这两种编码,则 Base64 将以 = 结尾,而十六进制将仅包含 [a-fA-F0-9]

    【讨论】:

    • 你是对的。我的印象是尾随 = 是强制性的,但在某些实现中它只是可选的填充。
    【解决方案3】:

    这应该不会太难。十六进制的有效字符集是[0-9a-f],而Base64 的有效字符集更像[a-zA-Z0-9\+/],可能带有一个或两个尾随= 字符用于填充。您应该能够使用正则表达式来区分一个和另一个。

    当然,在某些情况下,字符串似乎在两种编码中都有效,因此没有可靠的方法来仅基于字符串本身进行测试。但是,一般而言,以 Base64 编码的非平凡输入字符串很少会导致输出字符串仅包含有效的十六进制字符而没有填充字符。相当罕见,但并非不可能。

    【讨论】:

      猜你喜欢
      • 2022-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-17
      • 1970-01-01
      相关资源
      最近更新 更多