如何验证提交至服务器的整数是否为合法位掩码标志组合?
验证位掩码整数的合法性:检查是否仅包含已定义标志组合
当提交整数类型的位掩码标志时,核心验证逻辑是确保输入值的所有置位都属于预先定义的合法标志,具体可以通过以下步骤实现:
1. 计算合法位的总掩码
首先把所有非0的合法标志位做按位或运算,得到一个包含所有合法位的总掩码。示例中IS_NEW设为0(代表无标志状态),所以总掩码由其他有效标志组合而成:
define('IS_NEW', 0); define('IS_PAID', 2); define('IS_EXTEND', 4); define('IS_TRACK', 8); define('IS_VIP', 16); define('IS_HOT', 32); define('IS_BLOCKED', 64); // 合并所有有效标志位,得到合法位总掩码 $validMask = IS_PAID | IS_EXTEND | IS_TRACK | IS_VIP | IS_HOT | IS_BLOCKED; // 结果为126
2. 编写验证函数
利用按位与运算&的特性:如果输入值的所有置位都在合法掩码内,那么输入值 & 总掩码的结果会和原输入值完全相等。再单独处理IS_NEW对应的0值情况:
function isValidBitmask($input) { global $validMask; // 0对应IS_NEW,合法;否则检查所有位是否都在合法范围内 return $input === 0 || ($input & $validMask) === $input; }
3. 测试案例验证
var_dump(isValidBitmask(48)); // bool(true) → 16(IS_VIP) + 32(IS_HOT) = 48,所有位合法 var_dump(isValidBitmask(50)); // bool(true) → 2(IS_PAID) +16(IS_VIP)+32(IS_HOT)=50,合法 var_dump(isValidBitmask(75)); // bool(false) →75=64(IS_BLOCKED)+8(IS_TRACK)+2(IS_PAID)+1,其中1是未定义的位,非法
原理说明
- 按位与运算
&会保留输入值中所有在总掩码里的位,如果结果和原输入一致,说明输入没有超出合法位的范围。 IS_NEW设为0是特殊情况,它不占用任何二进制位,代表“无任何标志”的状态,所以单独判断输入为0的合法性。
内容的提问来源于stack exchange,提问作者Avatar
相关产品推荐
相关产品推荐

