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

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

php对两个字符串执行异或(^)运算时,会逐字符对其ascii码值进行按位异或,结果再转换为对应ascii字符;`”!” ^ “@”` 得到 `”a”`,正是因为 ascii 33 与 64 异或后等于 97,即字符 `’a’` 的编码

在 PHP 中,当 ^(异或)运算符的两个操作数均为字符串时,PHP 不会将其视为布尔或整型逻辑运算,而是按字符进行逐位 ASCII 码异或,并将结果重新组合为新字符串。这一行为由 PHP 官方文档明确定义:若 &、|、^ 的操作数均为字符串,则运算作用于各字符的 ASCII 值,最终返回字符串结果。

以示例代码为例:

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

其底层计算过程如下:

  • 字符 “!” 的 ASCII 十进制值为 33,二进制表示为 0100001(7 位,实际参与运算时按字节补齐为 8 位:00100001)
  • 字符 “@” 的 ASCII 十进制值为 64,二进制表示为 1000000 → 补齐为 01000000
  • 逐位异或(相同为 0,不同为 1):
  00100001   ← '!' (33)
^ 01000000   ← '@' (64)
──────────
  01100001   ← 结果:97(十进制)

01100001 对应十进制 97,恰好是小写字母 ‘a’ 的 ASCII 码。因此 $var 的值为字符串 “a”。

Figstack

Figstack

一个基于 Web 的AI代码伴侣工具,可以帮助跨不同编程语言管理和解释代码。

下载

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

⚠️ 注意事项:

  • 该行为仅适用于两个操作数均为字符串;若其中任一为整数,PHP 将尝试类型转换(如将字符串转为整数),可能导致意外结果(例如 “1” ^ “2” ≠ “a”);
  • 若字符串长度不同,PHP 会对较短字符串循环补位(PHP 8.0+ 已弃用此行为,建议避免);
  • 此特性常被用于轻量级字符串混淆或简单加密(如 XOR cipher),但绝不适用于安全敏感场景——因其可逆性极强且无密钥派生机制。

总结:理解 PHP 字符串位运算的关键,在于牢记「字符串异或 = 逐字节 ASCII 异或 → 转回字符」。掌握 ASCII 码对照与二进制运算,即可准确预测此类表达式的结果。

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

发表回复

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