Hexadezimal Rollen System

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Hexadezimal Rollen System

    Hallo Zusammen

    Ich habe folgende Rollen und deren Hex wert:

    0x1 - Employee
    0x2 - Pensioner
    0x4 - RoleOne
    0x10 - RoleTwo
    0x20 - RoleThree
    0x80 - RoleFour
    0x100 - RoleFive
    0x1000 - Administrator

    Nun habe ich den Dezimalwert 4353, welcher für die Rollen Employee,RoleFive & Admin steht.

    Nun möchte ich gerne wissen wie ich aus der Dezimalzahl 4353 die 3 verschiedenen Rollen heraus bekomme. Wie rechnet sich das?

    Freundliche Grüsse

    Lingo
    also du willst aus einem Enum-Wert, der 3 Rollen flagt (so nennt man es, wenn ein Bit gesetzt ist) umwandeln in eine Liste von 3 Enum-Werten, die jede genau eine Rolle flaggen?

    Wieso?

    Normalerweise testet man, ob eine Rolle geflaggt ist, dazu braucht man den Enum nicht zerlegen.

    Ich weiß jetzt nicht, ob du nur ein bestimmtes Problem gelöst haben willst, oder obs dich auch interessieren täte, das Konzept Enum mit allem drum und dran richtig zu verstehen.
    In letzterem Fall würde ich das Löffelmann2005-Buch empfehlen (kostenloser Download), da ist ein ausgezeichnetes Kapitel zu Enums drinne - Link sollteste in Entwickler-Ressourcen und Tools, Bücher und WebCasts finden
    @ErfinderDesRades

    Nun ich weiss nicht wie das System richtig funktioniert. Was im ersten Post steht konnte ich mir einfach selber zusammen reimen.
    Die Ausgangslage ist einfach, dass in der Datenbank 4353 steht und ich herausfinden muss welche Rollen dahinter stecken. Deswegen die Frage wie kann ich die Rollen herausfinden, welche die Zahl 4353 beinhaltet.

    @fichz

    Vielen dank werde ich mir durchlesen.
    Hallo Zusammen

    Mit folgendem Code habe ich nun, dass ganze lösen können:

    VB.NET-Quellcode

    1. u.rolesInt = (u.rolesInt Or mySelectedInteger)


    u = User Objekt
    rolesInt = Integer welche die Rollen Zahl des User beinhaltet z.B. 4097 (Administrator & Employee)
    mySelectedInteger = Rollen Filter z.B. 4096 (Administrator)

    Also 4097 = (4097 Or 4096).

    Kann mir jemand die Logik dahinter wörtlich hier posten was bei diesem Code überprüft wird?
    Denn für mich ergibt dies keinen Sinn, verstehe das Prinzip einfach nicht.

    Gruss Lingo

    EDIT://
    Es funktioniert eigentlich nach diesem Prinzip wie hier in der Lösungsantwort beschrieben: stackoverflow.com/questions/98…often-have-0-1-2-4-values

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Lingo“ ()

    @ErfinderDesRades

    Jup ha da unteranderem auch hineingeschaut. Sowie auch auf MSDN Enumerables angeschaut.
    Soweit verstehe ich, dass "flags" gesetzt warden. Also bei 7 = 00000111

    Aber ich verstehe das Statement hier nicht:

    VB.NET-Quellcode

    1. u.rolesInt = (u.rolesInt Or mySelectedInteger)


    Wäre froh wenn mir das jemand wörtlich erkären könnte.
    Versuch's mal mit AND statt mit OR.

    Nun möchte ich gerne wissen wie ich aus der Dezimalzahl 4353 die 3 verschiedenen Rollen heraus bekomme. Wie rechnet sich das?

    Quellcode

    1. Z. B.
    2. Dim Zahl as integer = 4353
    3. dim Text as String = ""
    4. IF (Zahl AND 1) = 1 THEN TEXT &= "Employee, "
    5. IF (Zahl AND 2) = 2 THEN TEXT &= "Pensioner, °
    6. IF (Zahl AND 4) = 4 THEN TEXT &= "RoleOne, "
    7. IF (Zahl AND &H10) = &H10 THEN TEXT &= "RoleTwo, "
    8. IF (Zahl AND &H20) = &H20 THEN TEXT &= "RoleThree, "
    9. IF (Zahl AND &H80) = &H80 THEN TEXT &= "RoleFour, "
    10. IF (Zahl AND &H100) = &H100 THEN TEXT &= "RoleFive, "
    11. IF (Zahl AND &H1000) = &H1000 THEN TEXT &= "Administrator"
    12. debug.print Text 'Employee, RoleFive, Administrator

    Eierlein schrieb:

    Versuch
    es doch gleich richtig.
    @Lingo So was:

    VB.NET-Quellcode

    1. <Flags>
    2. Private Enum Rollen
    3. Employee = 1
    4. Pensioner = 2
    5. RoleOne = 4
    6. RoleTwo = 16
    7. RoleThree = 32
    8. RoleFour = 128
    9. RoleFive = 256
    10. Administrator = 4096
    11. End Enum
    12. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    13. Dim rolle As Rollen = CType(4353, Rollen)
    14. Dim txt = "alles: " & rolle.ToString
    15. If rolle.HasFlag(Rollen.Employee) Then txt &= Environment.NewLine & "Employee"
    16. If rolle.HasFlag(Rollen.Pensioner) Then txt &= Environment.NewLine & "Pensioner"
    17. If rolle.HasFlag(Rollen.RoleOne) Then txt &= Environment.NewLine & "RoleOne"
    18. If rolle.HasFlag(Rollen.RoleTwo) Then txt &= Environment.NewLine & "RoleTwo"
    19. If rolle.HasFlag(Rollen.RoleThree) Then txt &= Environment.NewLine & "RoleThree"
    20. If rolle.HasFlag(Rollen.RoleFour) Then txt &= Environment.NewLine & "RoleFour"
    21. If rolle.HasFlag(Rollen.RoleFive) Then txt &= Environment.NewLine & "RoleFive"
    22. If rolle.HasFlag(Rollen.Administrator) Then txt &= Environment.NewLine & "Administrator"
    23. MessageBox.Show(txt)
    24. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!