Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Bitmasken prüfen (https://www.delphipraxis.net/65678-bitmasken-pruefen.html)

Luckie 19. Mär 2006 22:50


Bitmasken prüfen
 
Ich habe folgende Bitmasken:
Delphi-Quellcode:
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
Wie kann ich die jetzt am cleversten zerlegen? Ich habe keine Lust 33 if-Abfragen à la:
Delphi-Quellcode:
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;
zu schreiben.

Daniel G 19. Mär 2006 23:01

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.

Hawkeye219 19. Mär 2006 23:04

Re: Bitmasken prüfen
 
Etwa so? (ungetestet!)

Delphi-Quellcode:
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;
Das String-Array muß Du natürlich vollständig füllen und evtl. Sonderfälle (z.B. SV_TYPE_ALL) vorher abfangen.

Gruß Hawkeye

Luckie 19. Mär 2006 23:09

Re: Bitmasken prüfen
 
@Hawkeye: Ja so hatte ich mir das ungefähr vorgestellt.

negaH 20. Mär 2006 05:46

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;

Luckie 20. Mär 2006 07:29

Re: Bitmasken prüfen
 
Danke, werde ich so benutzen. Die Länge gleich am Anfang zu setzen ist natürlich günstiger.

himitsu 20. Mär 2006 10:36

Re: Bitmasken prüfen
 
Und wie wäre es hiermit,
Delphi-Quellcode:
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;
wenn du es eh nicht magst, daß Strings unnötig in ihrer Länge geändert werden? :roll:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz