AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi MAC-Hersteller-Zuordnung bzw. Wie mit einem sehr großen Datensatz umgehen?
Thema durchsuchen
Ansicht
Themen-Optionen

MAC-Hersteller-Zuordnung bzw. Wie mit einem sehr großen Datensatz umgehen?

Ein Thema von CodeX · begonnen am 23. Mär 2017 · letzter Beitrag vom 24. Mär 2017
 
nahpets
(Gast)

n/a Beiträge
 
#15

AW: MAC-Hersteller-Zuordnung bzw. Wie mit einem sehr großen Datensatz umgehen?

  Alt 24. Mär 2017, 11:57
Einen hätt' ich noch:

Wir bauen uns eine Komponente:
Delphi-Quellcode:
unit NMap_Map_Prefixes;

interface

uses
  SysUtils, Classes, Types;

type
  tNMap_Map_Prefixes = class(TComponent)
  private
    { Private-Deklarationen }
    fUrl : String;
    fIncludeFile : String;
    fIncludeUpdate : Boolean;
    fDubletten : TStringList;
    fHasDubletten : Boolean;
    fIncludeCreated : Boolean;
  protected
    { Protected-Deklarationen }
    procedure SetIncludeUpdate(AValue : Boolean);
    function CheckDubletten(sl : TStringList) : Boolean;
    function CreateInclude(sl : TStringList) : Boolean;
  public
    { Public-Deklarationen }
    Constructor Create(aOwner: TComponent); Override;
    Destructor Destroy; Override;
    function GetNameFromMAC(AMac : DWord) : String;
  published
    { Published-Deklarationen }
    property Url : String read fUrl write fUrl;
    property IncludeFile : String read fIncludeFile write fIncludeFile;
    property IncludeUpdate : Boolean read fIncludeUpdate write SetIncludeUpdate;
    property Dubletten : TStringList read fDubletten write fDubletten;
    property HasDubletten : Boolean read fHasDubletten;
    property IncludeCreated : Boolean read fIncludeCreated;
  end;

procedure Register;

implementation

uses
  IdHTTP, StrUtils;

procedure Register;
begin
  RegisterComponents('Stephan', [tNMap_Map_Prefixes]);
end;

Constructor tNMap_Map_Prefixes.Create(aOwner: TComponent);
begin
  inherited;
  fDubletten := TStringList.Create;
  fUrl := 'http://linuxnet.ca/ieee/oui/nmap-mac-prefixes';
  fIncludeFile := 'NMap_Map_Prefixes.inc';
end;

Destructor tNMap_Map_Prefixes.Destroy;
begin
  fDubletten.Free;
  inherited;
end;

function MyCompare(List: TStringList; Index1, Index2: Integer): Integer;
begin
  Result := CompareText(Copy(List[Index1],8,4096), Copy(List[Index2],8,4096));
end;

function tNMap_Map_Prefixes.GetNameFromMAC(AMac : DWord) : String;
begin
  case AMac of
    $000000 : Result := '<unbekannt>';
{$I NMap_Map_Prefixes.inc}
  else
    Result := '<unbekannt>';
  end;
end;

function tNMap_Map_Prefixes.CheckDubletten(sl : TStringList) : Boolean;
var
          s : String;
          i : Integer;
begin
  fDubletten.Clear;
  sl.Sort;
  s := '';
  for i := 0 to sl.Count - 1 do begin
    if s = Copy(sl[i],1,6) then begin
       fDubletten.Add(Format('Dublette %s',[Copy(sl[i],1,6)]));
       fDubletten.Add(Format('Dublette %s',[Copy(sl[i - 1],8,4096)]));
       fDubletten.Add(Format('Dublette %s',[Copy(sl[i],8,4096)]));
    end;
    s := Copy(sl[i],1,6);
  end;
  Result := fDubletten.Count <> 0;
end;

procedure tNMap_Map_Prefixes.SetIncludeUpdate(AValue : Boolean);
var
          idHTTP : TIDHttp;
          sl : TStringList;
          slInclude : TStringList;
begin
  fIncludeUpdate := AValue;
  sl := TStringList.Create;
  slInclude := TStringList.Create;
  idHTTP := tIDHTTP.Create(Self);
  sl.Text := idHTTP.Get(fUrl);
  fIncludeCreated := CreateInclude(sl);
  fHasDubletten := CheckDubletten(sl);
  idHTTP.Free;
  slInclude.Free;
  sl.Free;
  fIncludeUpdate := False;
end;

function tNMap_Map_Prefixes.CreateInclude(sl : TStringList) : Boolean;
var
          s : String;
          sCase : String;
          i : Integer;
          slInclude : TStringList;
begin
  DeleteFile(fIncludeFile);
  fIncludeCreated := false;
  fHasDubletten := false;
  slInclude := TStringList.Create;
  sl.CustomSort(MyCompare);
  s := '';
  sCase := '';
  for i := 0 to sl.Count - 1 do begin
    if s <> AnsiReplaceText(Copy(sl[i],8,4096),'''',''''' ') then begin
      if Trim(s) <> 'then begin
        slInclude.Add(Format(' %s: Result := ''%s'';',[sCase,s]));
      end;
      s := AnsiReplaceText(Copy(sl[i],8,4096),'''',''''' ');
      if Trim(s) <> 'then begin
        sCase := '$' + Copy(sl[i],1,6);
      end;
    end else begin
      if Length(sCase) = 70 then begin
        slInclude.Add(Format(' %s,',[sCase]));
        sCase := '';
      end;
      if sCase = 'then begin
        sCase := '$' + Copy(sl[i],1,6);
      end else begin
        sCase := sCase + ', $' + Copy(sl[i],1,6);
      end;
    end;
  end;
  slInclude.Add(Format(' %s: Result := ''%s'';',[sCase,s]));
  slInclude.SaveToFile(fIncludeFile);
  slInclude.Free;
  Result := FileExists(fIncludeFile);
end;

end.
Für {$I NMap_Map_Prefixes.inc} benötigen wir erstmal eine leere Datei.

Komponente auf's Formular pappen.
Bei der Eigenschaft IncludeFile den Dateinamen incl. Pfad für NMap_Map_Prefixes.inc eingeben.
Falls eine andere Url für die Datei http://linuxnet.ca/ieee/oui/nmap-mac-prefixes genutzt werden soll, kann diese in der Eigenschaft Url eingetragen werden. Der Aufbau der Datei muss natürlich identisch sein.

Doppelklick auf den Wert der Eigenschaft IncludeUpdate.

Jetzt arbeitet die IDE ein bisserl. Der Wert der Eigenschaft ändert sich nicht.

Sofern die Includedatei erstellt werden konnte, wird die Eigenschaft IncludeCreated auf True gesetzt.

Wurden doppelte Werte für die Case-Label gefunden, so wird die Eigenschaft HasDubletten auf True gesetzt.

Die Dubletten werden in der Eigenschaft Dubletten aufgeführt und können mit 'nem Doppelklick auf den Wert der Eigenschaft angezeigt werden.

Anschließend das Projekt neu erzeugen und ggfls. die Label-Dubletten in der Includedatei bereinigen.

Oder kurz:

Die IDE erzeugt uns zur Entwicklungszeit den von uns benötigten Quelltext.

Benutzen können wir ihn im Programm dann z. B. so:
ShowMessage(NMap_Map_Prefixes.GetNameFromMAC($049573));

PS.: Der Spass wurde mit Delphi 7 erstellt.
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:15 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