![]() |
Bitmasken prüfen
Ich habe folgende Bitmasken:
Delphi-Quellcode:
Wie kann ich die jetzt am cleversten zerlegen? Ich habe keine Lust 33 if-Abfragen à la:
const
SV_TYPE_WORKSTATION = $00000001; // A LAN Manager workstation SV_TYPE_SERVER = $00000002; // A LAN Manager server SV_TYPE_SQLSERVER = $00000004; // Any server running with Microsoft SQL Server SV_TYPE_DOMAIN_CTRL = $00000008; // Primary domain controller SV_TYPE_DOMAIN_BAKCTRL = $00000010; // Backup domain controller SV_TYPE_TIME_SOURCE = $00000020; // Server running the Timesource service SV_TYPE_AFP = $00000040; // Apple File Protocol server SV_TYPE_NOVELL = $00000080; // Novell server SV_TYPE_DOMAIN_MEMBER = $00000100; // LAN Manager 2.x domain member SV_TYPE_PRINTQ_SERVER = $00000200; // Server sharing print queue SV_TYPE_DIALIN_SERVER = $00000400; // Server running dial-in service SV_TYPE_XENIX_SERVER = $00000800; // Xenix server SV_TYPE_SERVER_UNIX = SV_TYPE_XENIX_SERVER; // SV_TYPE_NT = $00001000; // Windows Server 2003, Windows XP, Windows 2000, or Windows NT SV_TYPE_WFW = $00002000; // Server running Windows for Workgroups SV_TYPE_SERVER_MFPN = $00004000; // Microsoft File and Print for NetWare SV_TYPE_SERVER_NT = $00008000; // Windows Server 2003, Windows 2000 server, or Windows NT server that is not a domain controller SV_TYPE_POTENTIAL_BROWSER = $00010000; // Server that can run the browser service SV_TYPE_BACKUP_BROWSER = $00020000; // Server running a browser service as backup SV_TYPE_MASTER_BROWSER = $00040000; // Server running the master browser service SV_TYPE_DOMAIN_MASTER = $00080000; // Server running the domain master browser SV_TYPE_SERVER_OSF = $00100000; // SV_TYPE_SERVER_VMS = $00200000; SV_TYPE_WINDOWS = $00400000; // Windows95 and above SV_TYPE_DFS = $00800000; // Root of a DFS tree SV_TYPE_CLUSTER_NT = $01000000; // NT Cluster SV_TYPE_TERMINALSERVER = $02000000; // Terminal Server(Hydra) SV_TYPE_CLUSTER_VS_NT = $04000000; // NT Cluster Virtual Server Name SV_TYPE_DCE = $10000000; // IBM DSS (Directory and Security Services) or equivalent SV_TYPE_ALTERNATE_XPORT = $20000000; // return list for alternate transport SV_TYPE_LOCAL_LIST_ONLY = $40000000; // Return local list only SV_TYPE_DOMAIN_ENUM = DWORD($80000000); // Primary domain SV_TYPE_ALL = DWORD($FFFFFFFF); // handy for NetServerEnum2
Delphi-Quellcode:
zu schreiben.
function ServerTypeToStringArray(svType: DWORD): TStringDynArray;
begin if svType and SV_TYPE_WORKSTATION = 0 then begin setlength(result, length(result) + 1); result[High(result)] := 'Lan Manager Workstation'; end; if svType and SV_TYPE_SERVER = 0 then begin setlength(result, length(result) + 1); result[High(result)] := 'LAN Manager server'; end; end; |
Re: Bitmasken prüfen
Ich würde 2 Arrays nehmen (oder ein 2 - dimensionales), einmal mit den Werten und einmal mit den Bezichnungen und das in einer Schleife abarbeiten.
|
Re: Bitmasken prüfen
Etwa so? (ungetestet!)
Delphi-Quellcode:
Das String-Array muß Du natürlich vollständig füllen und evtl. Sonderfälle (z.B. SV_TYPE_ALL) vorher abfangen.
function ServerTypeToStringArray(svType: DWORD): TStringDynArray;
const cStrings : array [0..31] of string = ('LAN Manager workstation', 'LAN Manager server',...); var ii : Integer; begin for ii := 0 to 31 do begin if Odd(svType) then begin setlength(result, length(result) + 1); result[High(result)] := cStrings[ii]; svType := svType SHR 1; end; end; end; Gruß Hawkeye |
Re: Bitmasken prüfen
@Hawkeye: Ja so hatte ich mir das ungefähr vorgestellt.
|
Re: Bitmasken prüfen
leicht verbessert ;)
Delphi-Quellcode:
function ServerTypeToStrings(const svType: DWord): TStringDynArray; overload;
const cStrings: array[0..31] of String = ( 'LAN Manager workstation', 'LAN Manager server', ...); var I,J: Integer; begin J := 0; SetLength(Result, 32); for I := 0 to 31 do if Odd(svType shr I) then begin Result[J] := cStrings[I]; Inc(J); end; SetLength(Result, J); end; function ServerTypeToStrings(const svType: DWord; const Separator: String = ', '): String; overload; const cStrings: array[0..31] of String = ( 'LAN Manager workstation', 'LAN Manager server', ...); var I: Integer; begin Result := ''; for I := 0 to 31 do if Odd(svType shr I) then Result := Result + cStrings[I] + Separator; SetLength(Result, Length(Result) - Length(Separator)); end; procedure Test; begin ListBox.Items.Text := ServerTypeToStrings($12345678, #13#10); end; |
Re: Bitmasken prüfen
Danke, werde ich so benutzen. Die Länge gleich am Anfang zu setzen ist natürlich günstiger.
|
Re: Bitmasken prüfen
Und wie wäre es hiermit,
Delphi-Quellcode:
wenn du es eh nicht magst, daß Strings unnötig in ihrer Länge geändert werden? :roll:
function ServerTypeToStrings(const svType: DWord; const Separator: String = ', '): String; overload;
... begin Result := ''; for I := 0 to 31 do if Odd(svType shr I) then if Result = '' then Result := Result + cStrings[I] else Result := Result + Seperator + cStrings[i]; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz