PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bitweise Verknüpfung



Beatkiller
04-06-2006, 23:11
Hallo Leute,

ich steh grad mächtig auf dem Schlauch. Ich weiß was ich will, und wie ich es normal erreichen müsste, aber ich komm nicht weiter.

Ich möchte die Oktal-Werte von Zugriffsattributen in r, w und x umwandeln. Dabei wollte ich mit bitweiser Verknüpfung vorgehen.

Rein theoretisch sollte es doch so sein:

r = 4
w = 2
x = 1

rw- => 101


$r = 4;
$w = 2;
$x = 1;

if($mode & $r) // lesbar
if($mode & $w) // schreibbar
if($mode & $x) // ausführbar

Irgendwie bekomm ich aber immer alle 3 Attribute als true. Da kann doch was mit meiner Logik nicht stimmen. Wo is hier der Pferdefuss?

Romanday
05-06-2006, 09:29
Irgendwie bekomm ich aber immer alle 3 Attribute als true. Da kann doch was mit meiner Logik nicht stimmen. Wo is hier der Pferdefuss?

geht auch ohne Pferde.:D


<?php
$perms = fileperms('/etc/passwd');

if (($perms & 0xC000) == 0xC000) {
// Socket
$info = 's';
} elseif (($perms & 0xA000) == 0xA000) {
// Symbolic Link
$info = 'l';
} elseif (($perms & 0x8000) == 0x8000) {
// Regular
$info = '-';
} elseif (($perms & 0x6000) == 0x6000) {
// Block special
$info = 'b';
} elseif (($perms & 0x4000) == 0x4000) {
// Directory
$info = 'd';
} elseif (($perms & 0x2000) == 0x2000) {
// Character special
$info = 'c';
} elseif (($perms & 0x1000) == 0x1000) {
// FIFO pipe
$info = 'p';
} else {
// Unknown
$info = 'u';
}

// Owner
$info .= (($perms & 0x0100) ? 'r' : '-');
$info .= (($perms & 0x0080) ? 'w' : '-');
$info .= (($perms & 0x0040) ?
(($perms & 0x0800) ? 's' : 'x' ) :
(($perms & 0x0800) ? 'S' : '-'));

// Group
$info .= (($perms & 0x0020) ? 'r' : '-');
$info .= (($perms & 0x0010) ? 'w' : '-');
$info .= (($perms & 0x0008) ?
(($perms & 0x0400) ? 's' : 'x' ) :
(($perms & 0x0400) ? 'S' : '-'));

// World
$info .= (($perms & 0x0004) ? 'r' : '-');
$info .= (($perms & 0x0002) ? 'w' : '-');
$info .= (($perms & 0x0001) ?
(($perms & 0x0200) ? 't' : 'x' ) :
(($perms & 0x0200) ? 'T' : '-'));

echo $info;
?>

Beatkiller
05-06-2006, 11:51
Wha!! Jetzt seh ich meinen Fehler!

if(($mode & $r) == $r) //lesbar....

Herzlichen Dank!

undefined
05-06-2006, 14:12
Oder die Kurzform ;)


static protected function fh_FormatFilePerms( $i )
{
$p = ( $i & 00400 ) ? "r" : "-";
$p .= ( $i & 00200 ) ? "w" : "-";
$p .= ( $i & 00100 ) ? "x" : "-";
$p .= ( $i & 00040 ) ? "r" : "-";
$p .= ( $i & 00020 ) ? "w" : "-";
$p .= ( $i & 00010 ) ? "x" : "-";
$p .= ( $i & 00004 ) ? "r" : "-";
$p .= ( $i & 00002 ) ? "w" : "-";
$p .= ( $i & 00001 ) ? "x" : "-";
return $p;
}