5

学校で、バイナリ文字列を使用して権限を設定するシステムを見ました。

101001=41としましょう

それで :

  • 1は1ページへの許可になることができます
  • 2は2ページへの許可になることができます
  • 4は3ページへの許可になることができます
  • 8は4ページへの許可になることができます
  • 16は5ページへの許可になることができます
  • 32は6ページへの許可になることができます

したがって、上記のバイナリ文字列(101001)を取得したとします。1、4、6ページにアクセスできます。

PHPでこれを行うにはどうすればよいですか?permsMySQLにdecに格納されているという名前のフィールドがあるとしましょう。101001は41になります。PHPでは41が1、8、32に等しいことをどうやって知ることができますか?

ありがとう。

4

5 に答える 5

13

あなたがビットとビットごとの演算子について話しているように聞こえます。これを設定する最も簡単な方法は、すべての権限の定数を定義することです

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 & E_DEPRECATED実際に2進数で作業しているようなものを使用してエラー報告を設定したことがある場合。

于 2012-05-08T19:07:59.133 に答える
3

これが素敵なスニペットです。ここから取得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';
}
?>
于 2012-05-08T19:04:10.793 に答える
3

& 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ます。だからここに旗があります。3番目のビット(0100)をチェックすると、結果は0000になり、そのfalse値になります。したがって、ここには権限がありません。

于 2012-05-08T19:03:55.393 に答える
0

decbin2進数と10進数なので、とを使用して前後に変換できますbindec。数えるのは別のベースです...

編集:ビット単位は甘いです、それをしてください^ _ ^

于 2012-05-08T19:05:15.787 に答える
0

これがバイナリの性質です。各数値には1と0の組み合わせが1つだけあります。

PHPコメントからの関数decbin

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);
于 2012-05-08T19:03:47.120 に答える