Yo uso esta función que hice hace años. Tal vez se pueda mejorar pero funciona ...
El parámetro de entrada es una cadena hexdecimal y se asume que ESTÁ COMPLETA, QUE NO ESTÁ DESFAZADA, QUE CADA VALOR HEXADECIMAL ESTÁ REPRESENTADO POR 2 BYTES, QUE NO CONTIENE CARACTERES DIFERENTES DE 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D ,E, F.
function HexToStr(H: string): string;
var
i: Integer;
begin
Result := '';
if odd(Length(H)) then begin
Exit;
end;
for i := 1 to Length(H) div 2 do begin
Result := Result + Chr(Hex2Dec(H[(i * 2) -1] + H[i * 2]));
end; {<--- del for i }
end; {<--- HexToStr }