AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Beste IsHEX( AChar : Char ) Methode um Character auf HEX zu prüfen ?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Rollo62 · begonnen am 24. Jul 2020 · letzter Beitrag vom 27. Jul 2020
Antwort Antwort
Seite 1 von 2  1 2      
Rollo62

Registriert seit: 15. Mär 2007
4.075 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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 24. Jul 2020, 12:13
Im Delphi gibt es mehrere Funktionen/Klassen für Base64.
Hab hier grade nur XE und ein "halbes" 10.3 drauf ... units SysUtils/EncdDecd/TypeTrans können nur umcodieren ... weiß aber nicht ob die neuen Klassen im Delphi auch eine IsBase64-Funktion drin haben.
PS: Eine der neuen Klassen erlaubt auch Leerzeichen und Zeilenumbrüche im Base64-Text, um z.B. für den REST-Server zu lange Zeilen im JSON umbrechen zu können.

Ansonsten einfach dekodieren lassen ... entweder es geht oder nicht und wenn nicht, dann war es kein Base64.



CharInSet war ja auch die krankeste Idee, die jemand jemals hatte, dazumal sie im Inneren sowieso nur genau das Selbe machte, wie das, was man damit ersetzen sollte zwangsweise musste.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

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

Registriert seit: 15. Mär 2007
4.075 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 24. Jul 2020, 12:15
Im Delphi gibt es mehrere Funktionen/Klassen für Base64.

Einfach dekodieren lassen ... entweder es geht oder nicht und wenn nicht, dann ist es kein Base64.
Dankesehr für den Vorschlag, und das ist wirklich das schnellste ?
Muss ich mal reinschauen, KIJKG (*).



(*) KIJKG = Kann ich ja kaum glauben.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 24. Jul 2020, 12:26
Hatte vor Kurzem eine gefunden, aber da hier 10.3 grad kaputt und mein 10.4 daheim, bzw. der Quellcode wo ich die benutzte, grad etwas auser Reichweite ist, kann ich nicht schnell mal nachsehn.

Delphi hat inzwischen selbst viele neue Units/Klassen für Sowas, bzw. in den Basis-Units vom Indy, sowie in den HTTP/REST/SOAP/MAIL/DataSnap/EMS/...-Units, lässt sich sowas eigentlich immer irgendwo finden und oftmals auch einzeln nutzen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

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

Registriert seit: 15. Mär 2007
4.075 Beiträge
 
Delphi 12 Athens
 
#5

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

  Alt 24. Jul 2020, 12:30
Naja, ich sammle mal noch ein paar Vorschläge bis Dein 10.3 wieder läuft.
Wäre ja sicher auch für Andere spannend mal ein "amtliches" Ergebnis zu haben.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#6

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

  Alt 24. Jul 2020, 13:41
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

function IsHEX(const AChar: Char): Boolean;
begin
  case AChar of
    '0' .. '9', 'A' .. 'F', 'a' .. 'f':
      Result := True;
  else
    Result := False;
  end;
end;

begin
  try
     Writeln('0: ', IsHEX('0').ToString(TUseBoolStrs.True));
     Writeln('9: ', IsHEX('9').ToString(TUseBoolStrs.True));
     Writeln('a: ', IsHEX('a').ToString(TUseBoolStrs.True));
     Writeln('f: ', IsHEX('f').ToString(TUseBoolStrs.True));
     Writeln('A: ', IsHEX('A').ToString(TUseBoolStrs.True));
     Writeln('F: ', IsHEX('F').ToString(TUseBoolStrs.True));

     Writeln('-: ', IsHEX('-').ToString(TUseBoolStrs.True));
     Writeln('/: ', IsHEX('/').ToString(TUseBoolStrs.True));
     Writeln('g: ', IsHEX('g').ToString(TUseBoolStrs.True));
     Writeln('z: ', IsHEX('z').ToString(TUseBoolStrs.True));
     Writeln('G: ', IsHEX('G').ToString(TUseBoolStrs.True));
     Writeln('Z: ', IsHEX('Z').ToString(TUseBoolStrs.True));
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.
Produziert (Win32 Debug):

Code:
Project1.dpr.11: begin
0041B050 55               push ebp
0041B051 8BEC            mov ebp,esp
0041B053 51               push ecx
0041B054 668945FE        mov [ebp-$02],ax
Project1.dpr.12: case AChar of
0041B058 668B45FE        mov ax,[ebp-$02]
0041B05C 83C0D0           add eax,-$30
0041B05F 6683E80A        sub ax,$0a
0041B063 7212             jb +18     ; $0041b077
0041B065 83C0F9           add eax,-$07
0041B068 6683E806         sub ax,$06
0041B06C 7209             jb +9      ; $0041b077
0041B06E 83C0E6           add eax,-$1a
0041B071 6683E806         sub ax,$06
0041B075 7306             jnb +6      ; $0041b07d
Project1.dpr.14: Result := True;
0041B077 C645FD01         mov byte ptr [ebp-$03],$01
0041B07B EB04             jmp +4      ; $0041b081
Project1.dpr.16: Result := False;
0041B07D C645FD00         mov byte ptr [ebp-$03],$00
Project1.dpr.18: end;
0041B081 8A45FD          mov al,[ebp-$03]
0041B084 59               pop ecx
0041B085 5D              pop ebp
0041B086 C3               ret
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.075 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 24. Jul 2020, 14:06
@Tigü, Ja super
Warum bin ich da nicht selber drauf gekommen (bin wahrscheinlich mit den Gedanken in anderen Projekten).

Das wäre erstmal mein Favorit, bin gespannt ob man das noch toppen kann.
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
472 Beiträge
 
#8

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

  Alt 24. Jul 2020, 15:26
Hallo!

Aus der mORMot Unit SynCommons die Funktionen HexToCharValid(), HexToBin() oder für einen ganzen String IsHex().

Bis bald...
Thomas
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.075 Beiträge
 
Delphi 12 Athens
 
#9

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

  Alt 24. Jul 2020, 16:02
Delphi-Quellcode:
type
  TNormTableByte = packed array[byte] of byte;

var
  /// a conversion table from hexa chars into binary data
  // - returns 255 for any character out of 0..9,A..Z,a..z range
  // - used e.g. by HexToBin() function
  // - is defined globally, since may be used from an inlined function
  ConvertHexToBin: TNormTableByte;

var B,C: PtrUInt;
    tab: {$ifdef CPUX86NOTPIC}TNormTableByte absolute ConvertHexToBin{$else}PNormTableByte{$endif};

FillcharFast(ConvertHexToBin[0],SizeOf(ConvertHexToBin),255); // all to 255
  v := 0;
  for i := ord('0') to ord('9') do begin
    ConvertHexToBin[i] := v;
    inc(v);
  end;
  for i := ord('A') to ord('F') do begin
    ConvertHexToBin[i] := v;
    ConvertHexToBin[i+(ord('a')-ord('A'))] := v;
    inc(v);
  end;


function HexToCharValid(Hex: PAnsiChar): boolean;
begin
  result := (ConvertHexToBin[Ord(Hex[0])]<=15) and
            (ConvertHexToBin[Ord(Hex[1])]<=15);
end;

Der SynCommon verfolgt wohl den Table-Ansatz, der am schnellsten sein sollte, allerdings auf Kosten von 256 Einträgen.
Die ganze SysCommon Unit ist aber extrem verwurschtelt, WYSIWYG ist da nicht unbedingt gegeben.
Nur wegen dem IsHEX würde ich mir das nicht antun, auch wenn es ansonsten hochoptimiert aussieht.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#10

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

  Alt 24. Jul 2020, 18:19
ByteArray := TNetEncoding.Base64.DecodeStringToBytes(MyString);
Schade, mir war vorhin so, als wäre da auch Hexadezimal mit dabei gewesen.
OK, ist schon, aber nur indirekt im URL-Encode.

Delphi-Referenz durchsuchenTNetEncoding aus System.NetEncoding



: Delphi
BinToHex, HexToBin, IntToHex, StrToInt, Format -> System.Classes
MyInt.ToHexString und Integer.Parse/TryParse -> System.SysUtils
THash.DigestAsString -> System.Hash

: Indy
TIdEncoderBinHex4.Encode und TIdDecoderBinHex4.Decode -> IdCoderBinHex
TIdHash.HashBytesAsHex -> IdHash
BinToHexStr -> IdStrings
ToHex -> IdGlobal

: noch ein paar weitere total nutzlose Beispiele, wo sowas vorkommt
JDoubleClass.toHexString -> Androidapi.JNI.JavaTypes
ICryptographicBufferStatics.DecodeFromHexString -> Winapi.Security.Cryptography

: und für die total massoristisch Veranlagten
Hex2Bin, Hex2Dec, Hex2Oct -> c:\program files (x86)\embarcadero\studio\21.0\OCX\Servers\Excel2010.pas
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (24. Jul 2020 um 18:22 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 10:06 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