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 ?