![]() |
Delphi-Version: 10.4 Sydney
Beste IsHEX( AChar : Char ) Methode um Character auf HEX zu prüfen ?
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
Delphi-Quellcode:
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:
2. Das hier mit vorheriger Konvertierung ToUpper (wird wohl langsamer sein)
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;
Delphi-Quellcode:
3. Oder besser ohne vorherige Konvertierung ?
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;
Delphi-Quellcode:
4. Der Gewinner ist wohl eine Sprungtabelle, aber das kann es doch auch nicht sein ... Mal abgesehen vom Speicher.
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;
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 :stupid:)
Delphi-Quellcode:
Result LRegex.IsMatch( AChar, @"\A\b[0-9a-fA-F]+\b\Z");
Oder gibt es da vielleicht doch was "Amtlich" Fertiges in Delphi ? |
AW: Beste IsHEX( AChar : Char ) Methode um Character auf HEX zu prüfen ?
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. :stupid: 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. |
AW: Beste IsHEX( AChar : Char ) Methode um Character auf HEX zu prüfen ?
Zitat:
Muss ich mal reinschauen, KIJKG (*). (*) KIJKG = Kann ich ja kaum glauben. |
AW: Beste IsHEX( AChar : Char ) Methode um Character auf HEX zu prüfen ?
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. |
AW: Beste IsHEX( AChar : Char ) Methode um Character auf HEX zu prüfen ?
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. |
AW: Beste IsHEX( AChar : Char ) Methode um Character auf HEX zu prüfen ?
Delphi-Quellcode:
Produziert (Win32 Debug):
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.
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 |
AW: Beste IsHEX( AChar : Char ) Methode um Character auf HEX zu prüfen ?
@Tigü, Ja super :thumb:
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. |
AW: Beste IsHEX( AChar : Char ) Methode um Character auf HEX zu prüfen ?
Hallo!
Aus der mORMot Unit ![]() Bis bald... Thomas |
AW: Beste IsHEX( AChar : Char ) Methode um Character auf HEX zu prüfen ?
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. |
AW: Beste IsHEX( AChar : Char ) Methode um Character auf HEX zu prüfen ?
Delphi-Quellcode:
ByteArray := TNetEncoding.Base64.DecodeStringToBytes(MyString);
Schade, mir war vorhin so, als wäre da auch Hexadezimal mit dabei gewesen. :oops: OK, ist schon, aber nur indirekt im URL-Encode. ![]() : 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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:40 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