PHP中如何区分十六进制值与原字符串?
这个问题确实挺棘手的——因为当原始字符串的字符刚好全是十六进制合法字符时,单从内容上确实很难直接区分它和bin2hex转换后的结果。不过我们可以从bin2hex输出的固有特征,以及结合场景需求来解决:
解决方案
首先要明确:bin2hex()的输出有两个固定的、原始字符串不一定具备的特征:
- 长度一定是偶数:每个字节(ASCII字符)会被转换成两个十六进制字符;
- 仅包含小写十六进制字符:输出只会是
0-9、a-f的组合(PHP的bin2hex默认输出小写)。
基于这些特征,我们可以分场景处理:
场景1:判断字符串是否是某个原始字符串的bin2hex结果
如果你的需求是验证一个字符串是否由指定原始字符串经bin2hex生成,可以结合长度校验、字符合法性校验和反向转换匹配来实现:
<?php $original = '123'; $testStr = '313233'; // 待判断的字符串 // 第一步:校验长度是否为偶数,且全是十六进制字符 if (strlen($testStr) % 2 === 0 && ctype_xdigit($testStr)) { // 第二步:反向转换后与原始字符串对比 $converted = hex2bin($testStr); if ($converted === $original) { echo '这是原始字符串经过bin2hex得到的十六进制值'; } else { echo '这是由十六进制字符组成的普通字符串,不是目标原始串的bin2hex结果'; } } else { echo '这不是合法的十六进制字符串,肯定不是bin2hex的输出'; } ?>
场景2:处理极端无法从内容区分的情况
如果你的原始字符串本身就是偶数长度的纯十六进制字符(比如原始串是'1a',它的bin2hex结果是'3161'),这时候单从内容没法区分'1a'是原始字符串,还是某个其他字符串(比如hex2bin('1a')得到的不可见字符)的bin2hex结果。
这种情况下,唯一可靠的解决办法是额外存储元数据:在存储或传递字符串时,同时标记它的类型(是原始串还是hex转换后的串),比如用关联数组包装:
<?php // 存储时带上类型标记 $storedData = [ 'content' => '123', 'type' => 'original' // 可选值:'original' 或 'hex' ]; // 判断时直接读取标记 if ($storedData['type'] === 'hex') { echo '这是十六进制转换后的值'; } else { echo '这是原始字符串'; } ?>
你现有代码的问题说明
你之前的代码if(hex2bin($hex))逻辑存在缺陷:hex2bin()对奇数长度的十六进制输入(比如'123')只会抛出警告,但仍会返回转换结果(忽略最后一个字符),因此这个判断无法区分两种情况。而且它没有验证转换后的结果是否与原始字符串匹配,只是简单判断转换是否“不报错”。
内容的提问来源于stack exchange,提问作者L.Th
相关产品推荐
相关产品推荐

