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.