Pour convertir un nombre entier en une chaine de caractères hexadécimal.

Signaler
Messages postés
210
Date d'inscription
lundi 22 avril 2013
Statut
Membre
Dernière intervention
3 août 2020
-
Messages postés
3815
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
4 août 2020
-
const hexChars: array [0..$F] of Char='0123456789ABCDEF';

function Hexbyte(b:byte):string;
 begin
 hexbyte:=hexChars[b shr 4]+hexChars[b and $F];
 end;

function HexWord(w: Word):string;
 begin
 hexword:=hexbyte(hi(w))+hexbyte(lo(w));
 end;

function Hexlongint_24bits(color:tcolorref):string;
  begin
  Hexlongint_24bits:=Hexbyte(getrvalue(color))+Hexbyte(getgvalue(color))+Hexbyte(getbvalue(color));
  end;

écrit à Bourges

3 réponses

Messages postés
14567
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
4 août 2020
426
Bonjour

Depuis le temps que tu es membre de CodeS Sources, tu n’es toujours pas foutu de respecter 2 ou 3 trucs simples.

Le forum c’est pour les questions, et il est très fortement recommandé de dire bonjour.

Pour poster un source ou un snippet, de façon surprenante, c’est dans la partie Sources du site.

Enfin dans le forum ou les sources, utilise la coloration syntaxique https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code


Messages postés
257
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
4 août 2020
9
Salut,
mon simple avis, les fonctions sans "Result :=" c'est pas très propre, même si c'est fonctionnelle...
Après pourquoi réinventer la roue il existe la fonction "IntToHex"
La fonction HexByte, HexWord et Hexlongint_24bits peuvent donc être simplifiée par
function Hexbyte(b:byte):string;
begin
  //hexbyte:=hexChars[b shr 4]+hexChars[b and $F];
  Result := IntToHex(b,2);
end;

function HexWord(w: Word):string;
begin
  //hexword:=hexbyte(hi(w))+hexbyte(lo(w));
  Result := IntToHex(w,4);
end;

function Hexlongint_24bits(color:tcolorref):string;
begin  //Hexlongint_24bits:=Hexbyte(getrvalue(color))+Hexbyte(getgvalue(color))+Hexbyte(getbvalue(color));
  Result := IntToHex(GetRValue(Color), 2) + IntToHex(GetGValue(Color), 2) + IntToHex(GetBValue(Color), 2);
end;

Je vais aller un peu plus loin dans mon avis...
La fonction Hexlongint_24bits pour moi est mal nommée ca serait plutôt RGBToHex et pas un IntToHex comme le titre l'indique
Pourquoi ? Simplement parce que si l'on transforme un "TColorRef" en Hexa, le resultat est un BGR et non un RGB...
255 = 0000FF = Hexa = BGR hors un RGB = FF0000

Ensuite on peut encore simplifié la fonction Hexlongint_24bits en utilisant la fonction "Format" pour avoir un RGB
function RGBToHex(Color: TColor): String;
begin
  Result := Format('%.2x%.2x%.2x',[GetRValue(Color),GetGValue(Color),GetBValue(Color)]);
end;

Faisont la fonction inverse HexToRGB
function HexToRGB(S: String): TColor;
begin
  Result := RGB(StrToInt('$' + Copy(S, 5, 2)),StrToInt('$' + Copy(S, 3, 2)),StrToInt('$' + Copy(S, 1, 2)));
end;

Sinon on peut faire une fonction pour convertir un entier vers différentes tailles d'Hexa
type
  TSizeBits = (sb8Bits, sb16Bits, sb24Bits, sb32Bits, sb64Bits);

function Int64ToHex(const Value: Int64; ASizeBits: TSizeBits): string;
var
  I : Integer;
  Text : array[0..SizeOf(Int64)*2] of AnsiChar;
  PValue : PAnsiChar;
  PText : PAnsiChar;
  FSizeBits : Integer;
const
  Convert: array[0..15] of AnsiChar = AnsiString('0123456789ABCDEF');
begin
  case ASizeBits of
    sb8Bits: FSizeBits := 2;
    sb16Bits: FSizeBits := 4;
    sb24Bits: FSizeBits := 6;
    sb32Bits: FSizeBits := 8;
    sb64Bits: FSizeBits := 16;
    else
      FSizeBits := 16;
  end;
  PValue := @Value;
  PText := @Text;
  for I := SizeOf(Value) - 1 downto 0 do
  begin
    PText[0] := Convert[Byte(PValue[I]) shr 4];
    PText[1] := Convert[Byte(PValue[I]) and $F];
    Inc(PText, 2);
  end;
  Text[High(Text)] := #0;
  Result := string(Copy(Text, 17 -FSizeBits, MAX_PATH));
end;

@+
Messages postés
3815
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
4 août 2020
33
Maintenant que j'y ai mis la coloration syntaxique et compte tenu des deux précédents commentaires, ce qui saute aux yeux c'est que la place de ce code est à la corbeille.