PHP中字符串异或运算的ASCII码原理详解

PHP中字符串异或运算的ASCII码原理详解

php对字符串执行异或(^)运算时,会逐字符对其ascii码值进行按位异或,结果再转为对应ascii字符;”!”(33)与”@”(64)异或得97,即字符”a”。

在 PHP 中,当两个操作数均为字符串时,^(异或)运算符不会像整数那样直接作用于数值本身,而是以字符为单位,在 ASCII 码层面进行逐位异或运算。这是 PHP 特有的字符串位运算行为,由官方文档明确定义:若 &、|、^ 的两个操作数都是字符串,则运算会在组成字符串的各字符的 ASCII 值上执行,并返回一个等长的结果字符串。

以示例代码为例:

$var = ("!" ^ "@");
echo $var; // 输出:a

其底层计算过程如下:

  • “!” 的 ASCII 十进制值为 33,二进制表示为 0100001(7 位,实际参与运算时按字节对齐为 00100001)
  • “@” 的 ASCII 十进制值为 64,二进制表示为 1000000 → 01000000
  • 二者按位异或(XOR):
   00100001   ← '!' (33)
^  01000000   ← '@' (64)
------------
   01100001   = 97 (十进制) = 'a'

因此,$var 的值为单字符字符串 “a”。

Synthesys

Synthesys

Synthesys是一家领先的AI虚拟媒体平台,用户只需点击几下鼠标就可以制作专业的AI画外音和AI视频

下载

立即学习PHP免费学习笔记(深入)”;

⚠️ 注意事项:

  • 此行为仅适用于两个操作数同为字符串;若其中任一为整数,PHP 会尝试类型转换(可能导致意外结果,如 “!” ^ 64 会先将 “!” 转为 0 再异或);
  • 若字符串长度不同,PHP 会对较短字符串循环补全(从 PHP 8.1 起已弃用该行为,建议避免);
  • 实际开发中极少依赖此特性,多见于代码混淆、CTF 题目或底层协议处理,不推荐用于业务逻辑,因其可读性差且易出错。

总结:理解该现象的关键在于牢记——PHP 的字符串位运算 = ASCII 码逐字符按位运算 → 结果转回字符。掌握 ASCII 表与基本位运算,即可快速推演任意两字符异或结果。

https://www.php.cn/faq/2020744.html

发表回复

Your email address will not be published. Required fields are marked *