Einzelnen Beitrag anzeigen

Rollo62

Registriert seit: 15. Mär 2007
4.116 Beiträge
 
Delphi 12 Athens
 
#1

Beste IsHEX( AChar : Char ) Methode um Character auf HEX zu prüfen ?

  Alt 24. Jul 2020, 12:05
Delphi-Version: 10.4 Sydney
Hallo zusammen,

ich baue gerade ein paar Basis-Funktionen um, und bin im Moment darüber gestolpert
das CharInSet deprecated ist.

Da frage ich mich was wohl am Besten / Schnellsten wäre um ein HEX-Char zu entdecken.
Also ich suche ein
  function IsHEX( const AChar :Char ) : Boolean;


1. Das wäre die volle Abfrage, mit Ord() als intrinsic Funktion sollte bei Konstanten doch eine Integer Konstante eintragen, oder rechnet der etwa bei Runtime Alle einzeln jedes Mal neu durch ?
Delphi-Quellcode:
var LChr : Integer;

     LChr := Ord( AChar );

     if InRange( LChr, Ord( '0' ), Ord( '9' ) )
         or InRange( LChr, Ord( 'A' ), Ord( 'F' ) )
         or InRange( LChr, Ord( 'a' ), Ord( 'f' ) ) then
         Result := True // Is is a HEX Char
     else
         Result := False;
2. Das hier mit vorheriger Konvertierung ToUpper (wird wohl langsamer sein)
Delphi-Quellcode:
var LChr : Integer;

     LChr := Ord( AChar.ToUpper );

     if InRange( LChr, Ord( '0' ), Ord( '9' ) )
         or InRange( LChr, Ord( 'A' ), Ord( 'F' ) ) then
         Result := True // Is is a HEX Char
     else
         Result := False;
3. Oder besser ohne vorherige Konvertierung ?
Delphi-Quellcode:
     if ( (AChr >= '0' ) and ( AChar <= '9' ) )
         or ( (AChr >= 'A' ) and ( AChar <= 'F' ) )
         or ( (AChr >= 'a' ) and ( AChar <= 'f' ) ) then
         Result := True // Is is a HEX Char
     else
         Result := False;
4. Der Gewinner ist wohl eine Sprungtabelle, aber das kann es doch auch nicht sein ... Mal abgesehen vom Speicher.
Delphi-Quellcode:
     Result := CHEXTable( AChr and $FF );

//mal das hier als C Anregung
int isHex(char c)
{
    static int s_hex_digit[1 << CHAR_BIT] = {
        ['0'] = 1, ['1'] = 1, ['2'] = 1, ['3'] = 1, ['4'] = 1,
        ['5'] = 1, ['6'] = 1, ['7'] = 1, ['8'] = 1, ['9'] = 1,
        ['A'] = 1, ['B'] = 1, ['C'] = 1, ['D'] = 1, ['E'] = 1, ['F'] = 1,
        ['a'] = 1, ['b'] = 1, ['c'] = 1, ['d'] = 1, ['e'] = 1, ['f'] = 1
    }
;
    return s_hex_digit[(unsigned char)c];
}


5. Ein HashMap ähnliches Dictionary ?


6. Eine Version irgendwas mit RexEx ( neee, das doch wohl nicht )
  Result LRegex.IsMatch( AChar, @"\A\b[0-9a-fA-F]+\b\Z");

Oder gibt es da vielleicht doch was "Amtlich" Fertiges in Delphi ?

Geändert von Rollo62 (24. Jul 2020 um 12:32 Uhr)
  Mit Zitat antworten Zitat