pl: Berechtigungen

Hi,

das Bit für die Schreibberechtigung hat die Wertigkeit 2. Betrachten wir die Zahl 5, sehen wir, dass darin die Wertigkeiten 4 (Lesebit) und 1 (Ausführenbit) drinstecken. Also ist keine Scheibberechtigung drin, das sehen wir. Die Frage ist, wie programmiere ich das möglichst einfach?

Gegeben sei ein numerischer Wert von 0..7 und rauskommen soll, welche Bits (Lesen, Schreiben, Ausführen) zu setzen sind. pl

  1. Die Frage ist, wie programmiere ich das möglichst einfach?

    Kontrollstrukturen?

    1. Die Frage ist, wie programmiere ich das möglichst einfach?

      Kontrollstrukturen?

      Beispiel?

  2. Hallo,

    das Bit für die Schreibberechtigung hat die Wertigkeit 2. Betrachten wir die Zahl 5, sehen wir, dass darin die Wertigkeiten 4 (Lesebit) und 1 (Ausführenbit) drinstecken. Also ist keine Scheibberechtigung drin, das sehen wir. Die Frage ist, wie programmiere ich das möglichst einfach?

    die Frage meinst du nicht ernst, oder?

    Gegeben sei ein numerischer Wert von 0..7 und rauskommen soll, welche Bits (Lesen, Schreiben, Ausführen) zu setzen sind.

    Maskierung (UND-Verknüpfung) mit 1, 2 oder 4, je nachdem, was du wissen willst.

    So long,
     Martin

  3. Tach!

    das Bit für die Schreibberechtigung hat die Wertigkeit 2. Betrachten wir die Zahl 5, sehen wir, dass darin die Wertigkeiten 4 (Lesebit) und 1 (Ausführenbit) drinstecken. Also ist keine Scheibberechtigung drin, das sehen wir. Die Frage ist, wie programmiere ich das möglichst einfach?

    Was genau meinst du?

    Gegeben sei ein numerischer Wert von 0..7 und rauskommen soll, welche Bits (Lesen, Schreiben, Ausführen) zu setzen sind.

    Die Bits sind bereits gesetzt, wenn du einen handelsüblichen unsigned integer nimmst.

    dedlfix.

    1. Tach! Die Bits sind bereits gesetzt, wenn du einen handelsüblichen unsigned integer nimmst.

      Naja, so ganz von alleine wird eine checkbox auch nicht checked ;)

      1. Tach!

        Die Bits sind bereits gesetzt, wenn du einen handelsüblichen unsigned integer nimmst.

        Naja, so ganz von alleine wird eine checkbox auch nicht checked ;)

        Du möchtest also nicht herausfinden, "welche Bits zu setzen sind", sondern welche gesetzt sind. Sag das doch gleich. Dann, wie Der Martin schon sagte, den Wert mit einer Maske (abzufragendes Bit ist als einziges gesetzt) mit bitweisem AND verknüpfen und schauen, ob was unten raus fällt - sprich, von 0 verschieden ist.

        dedlfix.

        1. und schauen, ob was unten raus fällt -

          Genau! Das müssn wir dann nur noch an der richtigen Stelle auffangen :)

          1. Hi,

            und schauen, ob was unten raus fällt -

            Genau! Das müssn wir dann nur noch an der richtigen Stelle auffangen :)

            das erinnert mich an einen Laboraufbau, wo der Kollege beim Querschnitt der Leitungen für die Stromversorgung deutlich gespart hat. Und ich habe ihm dann empfohlen, er möge doch bitte einen Spannungsabfalleimer unter diese Leitung stellen.

            Ciao,
             Martin

  4. Hallo pl,

    schau dir mal die Bit-Operatoren an. Im wesentlichen brauscht du &, | und ~:

    • n & x == x ist wahr, wenn das Bit x in n gesetzt ist
    • n = n | x setzt das Bit x in n
    • n = n & ~x schaltet das Bit x in n wieder aus
    → ckruse@motte ~  % perl -e 'print 7 & 2,"\n";'
    2
    → ckruse@motte ~  % perl -e 'print 7 & 4,"\n";'
    4
    → ckruse@motte ~  % perl -e 'print 7 & 1,"\n";'
    1
    → ckruse@motte ~  % perl -e 'print 1 | 2,"\n";'    
    3
    → ckruse@motte ~  % perl -e 'print 1 | 2 | 4,"\n";'
    7
    → ckruse@motte ~  % perl -e 'print 2 | 4,"\n";' 
    6
    → ckruse@motte ~  % perl -e 'print 7 & ~2,"\n";'
    5
    → ckruse@motte ~  % perl -e 'print 7 & ~4,"\n";'
    3
    → ckruse@motte ~  % perl -e 'print 7 & ~1,"\n";'
    6
    

    LG,
    CK

    1. Hallo pl,

      schau dir mal die Bit-Operatoren an. Im wesentlichen brauscht du &, | und ~:

      Überschlafen. stat(FILE) liefert einen integer. Die zu untersuchenden Bits, insgesamt sind das neun an der Zahl, erhalten wir infolge Verschiebung nach rechts mit dem Shift-Operator. Nach der bitweise Verschiebung wird jeweils mit 1 maskiert, so erhalten wir die einzelne Berechtigung. pl

      1. Tach!

        stat(FILE) liefert einen integer. Die zu untersuchenden Bits, insgesamt sind das neun an der Zahl, erhalten wir infolge Verschiebung nach rechts mit dem Shift-Operator. Nach der bitweise Verschiebung wird jeweils mit 1 maskiert, so erhalten wir die einzelne Berechtigung.

        Getreu dem Motto: Warum einfach (nur AND-maskiert mit 1,2,4,...), wenn es auch umständlich geht?

        dedlfix.

        1. Tach!

          stat(FILE) liefert einen integer. Die zu untersuchenden Bits, insgesamt sind das neun an der Zahl, erhalten wir infolge Verschiebung nach rechts mit dem Shift-Operator. Nach der bitweise Verschiebung wird jeweils mit 1 maskiert, so erhalten wir die einzelne Berechtigung.

          Getreu dem Motto: Warum einfach (nur AND-maskiert mit 1,2,4,...), wenn es auch umständlich geht?

          Ach bitte zeig doch mal Deinen Code hierzu wenn Dir das so einfach erscheint. Kleiner Hinweis: Gegeben ist ein integer. Anhand dieser einen Zahl sind Platzhalter zu setzen für neun Checkboxen, checked oder nicht und ich denke schon, dass ich dafür 9 Zeilen Code brauche.

          Bildbeschreibung

          1. Tach!

            Gegeben ist ein integer. Anhand dieser einen Zahl sind Platzhalter zu setzen für neun Checkboxen, checked oder nicht und ich denke schon, dass ich dafür 9 Zeilen Code brauche.

            Ja, aber das Schieben muss nicht sein.

            $bit0 = (bool)($permission & 1); // alternativ mit Oktaltahl: 0001
            $bit1 = (bool)($permission & 2); // 0002
            $bit2 = (bool)($permission & 4); // 0004
            $bit3 = (bool)($permission & 8); // 0010
            $bit4 = (bool)($permission & 16); // 0020
            $bit5 = (bool)($permission & 32); // 0040
            $bit6 = (bool)($permission & 64); // 0100
            $bit7 = (bool)($permission & 128); // 0200
            $bit8 = (bool)($permission & 256); // 0400
            

            Deine ursprünglicher Text ging von den Wertigkeiten (1, 2, 4, 8, ...) aus. Die spiegeln sich in obigem Code deutlich wider. Beim Verschieben und Maskieren mit 1 sieht man diese Wertigkeit nicht mehr. Je nachdem wie du das Verschieben löst, kann man nur die Position erkennen oder auch nicht (wenn es in einer Schleife stattfindet).

            Es kann natürlich sein, dass eine Schleife und das Verschieben trotzdem die bessere Lösung in einem speziellen Fall ist, aber da du die näheren Umstände und damit die eigentliche Aufgabe nicht offenbart hast, kann ich nur generell antworten. Und da ist das einfache Maskieren weniger umständlich als ein zusätzliches Verschieben.

            dedlfix.

            1. Danke Dir!

              Gegeben ist ein integer. Anhand dieser einen Zahl sind Platzhalter zu setzen für neun Checkboxen, checked oder nicht und ich denke schon, dass ich dafür 9 Zeilen Code brauche.

              Ja, aber das Schieben muss nicht sein.

              Es macht den Code verständlicher. Bereits anhand dieser String-Schreibweise -rwxr-xr-x wird ein Programmierer eine Verschiebung als Lösung anstreben, v.l.n.r.: Owner, Group, Other.

              Und ja: Sprechende Variablen, gerade für die Platzhalter:

                      $self->{STASH}{owner_read}    = 'checked' if $owner & 4;
                      $self->{STASH}{owner_write}   = 'checked' if $owner & 2;
                      $self->{STASH}{owner_execute} = 'checked' if $owner & 1;
                        .....
              
              1. Moin!

                Ja, aber das Schieben muss nicht sein.

                Es macht den Code verständlicher. Bereits anhand dieser String-Schreibweise -rwxr-xr-x wird ein Programmierer eine Verschiebung als Lösung anstreben, v.l.n.r.: Owner, Group, Other.

                Und was ist mit SETUID und SETGID? Die tauchen in dieser rwx-Schreibweise nämlich unpraktischerweise als Alternative zum X auf, landen in der Oktaldarstellung aber ganz wo anders.

                Grüße Sven

                1. Moin!

                  Ja, aber das Schieben muss nicht sein.

                  Es macht den Code verständlicher. Bereits anhand dieser String-Schreibweise -rwxr-xr-x wird ein Programmierer eine Verschiebung als Lösung anstreben, v.l.n.r.: Owner, Group, Other.

                  Und was ist mit SETUID und SETGID? Die tauchen in dieser rwx-Schreibweise nämlich unpraktischerweise als Alternative zum X auf, landen in der Oktaldarstellung aber ganz wo anders.

                  Es heißt Lesebit, Schreibbit, Ausführenbit, von links nach rechts, Owner, Group, Other und das sind tatsächlich Bits und nicht nur das, die stehen alle neune auch noch direkt nebeneinander.

                  Also das schreit ja förmlich nach dem Shift-Operator. So programmiert ist dann auch ein Kommentar nicht unbedingt notwendig.

                          my $stat = [stat $fullname]; # Dateiname
                          $self->{STASH}{owner_read}    = 'checked' if 1 & $stat->[2] >> 8;
                          $self->{STASH}{owner_write}   = 'checked' if 1 & $stat->[2] >> 7;
                          $self->{STASH}{owner_execute} = 'checked' if 1 & $stat->[2] >> 6;
                          $self->{STASH}{group_read}    = 'checked' if 1 & $stat->[2] >> 5;
                          $self->{STASH}{group_write}   = 'checked' if 1 & $stat->[2] >> 4;
                          $self->{STASH}{group_execute} = 'checked' if 1 & $stat->[2] >> 3;
                          $self->{STASH}{other_read}    = 'checked' if 1 & $stat->[2] >> 2;
                          $self->{STASH}{other_write}   = 'checked' if 1 & $stat->[2] >> 1;
                          $self->{STASH}{other_execute} = 'checked' if 1 & $stat->[2] >> 0;
                  

                  Setzt die Platzhalter fürs Formular.

                  1. Tach,

                    Es heißt Lesebit, Schreibbit, Ausführenbit, von links nach rechts, Owner, Group, Other und das sind tatsächlich Bits und nicht nur das, die stehen alle neune auch noch direkt nebeneinander.

                    Sven wollte darauf hinaus, dass du nur drei der vier Oktette auswertest, die die Berechtigungen beschreiben, und das erste Oktet, wird traditionell an der selben Stelle, wie die drei Ausführen-Bits geschrieben (kleines oder großes s und t an Stelle des jeweiligen x).

                    mfg
                    Woodfighter

  5. das Bit für die Schreibberechtigung hat die Wertigkeit 2.

    Der Chuck Norris unter den Bits kennt drei statt nur zwei Niveaus: gesetzt, nicht gesetzt und fucking ZWEI!

    1. Hi,

      das Bit für die Schreibberechtigung hat die Wertigkeit 2.

      Der Chuck Norris unter den Bits kennt drei statt nur zwei Niveaus: gesetzt, nicht gesetzt und fucking ZWEI!

      ;-)

      Und dann gibt es noch Fuzzy Logic, sozusagen die Digitaltechnik aus der Waldorfschule:
      Wenn Null mal besonders groß ausfällt, ist es manchmal fast so gut wie ein bisschen Eins.

      So long,
       Martin

      1. Hallo,

        Und dann gibt es noch Fuzzy Logic, sozusagen die Digitaltechnik aus der Waldorfschule:
        Wenn Null mal besonders groß ausfällt, ist es manchmal fast so gut wie ein bisschen Eins.

        Da bräuchtest du dann sogar drei Bits, die ein bisschen Eins sind, um auf insgesamt zwei zu kommen.

        Gruß
        Kalk

      2. Hallo Der Martin,

        Und dann gibt es noch Fuzzy Logic, sozusagen die Digitaltechnik aus der Waldorfschule:
        Wenn Null mal besonders groß ausfällt, ist es manchmal fast so gut wie ein bisschen Eins.

        $$\lim_{3 \to 4} \sqrt{3} = 2$$

        Bis demnächst
        Matthias

        --
        Das Geheimnis des Könnens liegt im Wollen. (Giuseppe Mazzini)
    2. das Bit für die Schreibberechtigung hat die Wertigkeit 2.

      Der Chuck Norris unter den Bits kennt drei statt nur zwei Niveaus: gesetzt, nicht gesetzt und fucking ZWEI!

      Zyklopen, als die Einäugigen unter den Blinden, meinen, den Begriff Wertigkeitsystem auf einer Steintafel wenigstens schon einmal gelesen zu haben und können sich sogar erinnern, dass dem Lesebit bereits im prähelenischen Reich die Wertigkeit 4 zugeordnet wurde.

      Das sog. Trinkbit aus der Eifel hingegen hat nur eine geringe Wertigkeit nahe 0.