【问题标题】:Set permissions in binary以二进制设置权限
【发布时间】:2012-05-17 07:12:56
【问题描述】:

我在学校看到一个使用二进制字符串设置权限的系统。

假设 101001 = 41

所以:

  • 1 可以是第 1 页的权限
  • 2可以是第2页的权限
  • 4可以是第3页的权限
  • 8可以是第4页的权限
  • 16可以是第5页的权限
  • 32可以是第6页的权限

假设我得到了上面的二进制字符串 (101001)。我可以访问第 1、4 和 6 页。

如何在 PHP 中做到这一点?假设我在 MySQL 中有一个名为 perms 的字段存储在 dec 中,因此 101001 将是 41。我怎么知道 41 在 PHP 中等于 1、8 和 32?

谢谢。

【问题讨论】:

    标签: php


    【解决方案1】:

    这就是二进制的本质——每个数字只有一个 1 和 0 的组合。

    decbin 的 PHP cmets 函数:

    function bindecValues($decimal, $reverse=false, $inverse=false) {
    /*
    1. This function takes a decimal, converts it to binary and returns the
         decimal values of each individual binary value (a 1) in the binary string.
         You can use larger decimal values if you pass them to the function as a string!
    2. The second optional parameter reverses the output.
    3. The third optional parameter inverses the binary string, eg 101 becomes 010.
    -- darkshad3 at yahoo dot com
    */
    
        $bin = decbin($decimal);
        if ($inverse) {
            $bin = str_replace("0", "x", $bin);
            $bin = str_replace("1", "0", $bin);
            $bin = str_replace("x", "1", $bin);
        }
        $total = strlen($bin);
    
        $stock = array();
    
        for ($i = 0; $i < $total; $i++) {
            if ($bin{$i} != 0) {
                $bin_2 = str_pad($bin{$i}, $total - $i, 0);
                array_push($stock, bindec($bin_2));
            }
        }
    
        $reverse ? rsort($stock):sort($stock);
        return implode(", ", $stock);
    }
    

    用法

    $binary_array = bindecValues(41);
    

    这将使binary_array:

    array(1, 8, 32);
    

    【讨论】:

      【解决方案2】:

      您可以使用&amp; operator 并检查这些标志。

      $READ = 8;
      $WRITE = 1;
      $EXECUTE = 32;
      $permissions = 41;
      if ($permissions & $READ) {
         // do smth
      }
      if ($permissions & $WRITE ) {
         // do smth
      }
      if ($permissions & $EXECUTE ) {
         // do smth
      }
      

      让我解释一下。如果您有位 1001 (9)。您只需检查位 (1000) 和 1001。您只需将 $permissions 变量的每一位与位数相乘。结果将是 1000。它可以转换为 true 值。所以你在这里有旗帜。如果检查第三位(0100),它将导致 0000 并且它是 false 值。所以你这里没有权限。

      【讨论】:

      • 非常感谢。我更喜欢不变,因为我接受了另一个。
      【解决方案3】:

      这是一个不错的sn-p。取自这里http://www.litfuel.net/tutorials/bitwise.htm

      <?php
      $read = 1;
      $write = 2;
      $readwrite = 16;
      $local_admin = 32;
      $global_admin = 64;
      
      $jim = 96;
      $mike = 16;
      
      echo "Is Mike Allowed to edit? he has an access level of 16<BR>";
      if ($mike & 32) {
          echo 'YES MIKE CAN EDIT';
      } else {
          echo 'NO HE CANNOT';
      }
      
      echo "<BR><BR>Is Jim Allowed to edit? he has an access level of 96<BR>";
      if ($jim & 32) {
          echo 'YES JIM CAN EDIT';
      } else {
          echo 'NO HE CANNOT';
      }
      ?>
      

      【讨论】:

        【解决方案4】:

        由于它是二进制和十进制,您可以使用decbinbindec 来回转换它。这只是一个不同的基础......

        编辑:按位是甜蜜的,这样做^_^

        【讨论】:

          【解决方案5】:

          听起来您在谈论位和位运算符。最简单的设置方法是为每个权限定义常量

          const POST   = 1;
          const DELETE = 2;
          const UPDATE = 4;
          const READ   = 8;
          

          一旦定义了这些,就很容易使用按位运算符进行比较:

          $userValue = '1101';
          
          if ($userValue & self::POST) {
            echo 'Can Post';
          }
          
          if ($userValue & self::DELETE) {
            echo 'Can Delete';
          }
          
          if ($userValue & self::UPDATE) {
            echo 'Can Update';
          }
          
          if ($userValue & self::READ) {
            echo 'Can Read';
          }
          

          这就是 PHP 自己的常量的工作量。如果您曾经使用E_ALL &amp; E_DEPRECATED 之类的方式设置错误报告,那么您实际上是在使用二进制数。

          【讨论】:

          • 谢谢。对于这种用法,我更喜欢使用常量而不是变量。
          猜你喜欢
          • 2013-08-02
          • 2020-12-20
          • 1970-01-01
          • 1970-01-01
          • 2020-04-30
          • 2015-02-25
          • 1970-01-01
          • 2022-08-22
          • 2011-05-31
          相关资源
          最近更新 更多