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

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

php 对两个单字符字符串执行 `^`(异或)运算时,会对其 ascii 码值进行按位异或,结果再转为对应 ascii 字符;`”!” ^ “@”` 得到 `”a”` 正是因为 33 ^ 64 = 97,而 ascii 97 对应字符 `’a’`。

在 PHP 中,当 ^(按位异或)操作符的两个操作数均为字符串时,PHP 不会将其视为整数运算,而是逐字符对齐,对每个字符的 ASCII 值执行按位异或,并将结果重新组合为字符串(PHP 官方文档明确说明:“If both operands for the &, | and ^ operators are strings, then the operation will be performed on the ASCII values of the characters…”)。

以 $var = “!” ^ “@”; 为例:

  • “!” 的 ASCII 十进制值为 33,二进制表示为 0100001(7 位,实际参与运算时按字节补零至 8 位:00100001)
  • “@” 的 ASCII 十进制值为 64,二进制表示为 1000000 → 补零后为 01000000

进行按位异或(相同为 0,不同为 1):

  00100001   ← '!' (33)
^ 01000000   ← '@' (64)
-----------
  01100001   = 97 (十进制) → ASCII 字符 'a'

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

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

牛面

牛面

牛面AI面试,大厂级面试特训平台

下载

✅ 补充说明与注意事项:

  • 该行为仅适用于字符串类型操作数;若任一操作数为整数,PHP 将尝试类型转换(可能触发警告或意外结果),例如 (int)”!” ^ (int)”@” 会先强制转为 0 ^ 0 = 0。
  • 多字符字符串会逐字符异或(短字符串会按需重复/截断,具体取决于 PHP 版本,但单字符最安全、最可预测)。
  • 此特性常被用于轻量级字符串混淆、CTF 题目或某些加密原型中,但切勿用于生产环境的安全敏感逻辑(缺乏完整性校验、易受已知明文攻击)。

? 小实验验证:

掌握这一机制,不仅能解惑类似 “!” ^ “@” === “a” 的“魔法输出”,更能帮助你读懂底层字符串操作逻辑,规避隐式类型转换带来的陷阱。

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

发表回复

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