voila ce qu'il te faut depuis le debut :::
const
MaxBinLength = 4096;
MaxBinStrLength = MaxBinLength shr 1;
type
p2Bytes = ^T2Bytes;
T2Bytes = array[0..1] of byte;
TBin = array[0..MaxBinLength-1] of byte;
{ StrToBin
convertis une chaine qui represente une valeur hexa decimale en sa representation
binaire (tableau de bytes).
la taille maximale de ce tableau est donnée par la constante MaxBinLength,
la taille maximale de la chaine entrante est donnée par la constante MaxBinStrLength
PARAMETRES :
S [I] AnsiString, chaine representant une valeur hexadecimale
Bin [O] TBin (Tableau de bytes), valeur binaire de la chaine
RETOUR :
integer, renvois la taille ecrite dans Bin ou code erreur (<= 0)
0 : S est vide
-2 : S n'as pas une taille valide (doit etre multiple de 2) : F est mauvais, 0F est ok
-1 : la taille de S depasse la capacité du buffer (MaxBinLength)
-3 : S possede des caracteres invalide (n'est pas dans 0123456789ABCDEFabcdef)
}
function StrToBin(const S : AnsiString; var Bin : TBin): integer;
var pW : p2Bytes;
N, L : integer;
W1, W0 : integer;
begin
result := 0;
if S = EmptyStr then
exit;
pW := @S[1];
L := Length(S);
if (L and $1) = $1 then
begin
result := -2;
exit;
end;
result := L shr 1;
if result > MaxBinLength then
begin
result := -1;
exit;
end;
for N := 0 to result-1 do
begin
W0 := pW^[0];
W1 := pW^[1];
case W0 of
$30..$39 : dec(W0, $30);
$41..$46 : dec(W0, $37);
$61..$66 : dec(W0, $57);
else
result := -3;
exit;
end;
case W1 of
$30..$39 : dec(W1, $30);
$41..$46 : dec(W1, $37);
$61..$66 : dec(W1, $57);
else
result := -3;
exit;
end;
Bin[N] := byte((W0 shl 4) or W1);
inc(pW);
end;
end;
{ BinToStr
Convertis un ensemble de valeurs binaire (TBin) en une chaine lisible. Sont fonctionnement
est inverse a celui de StrToBin.
PARAMETRES :
Bin [I] TBin, ensemble de valeurs binaire
BinSize [I] Integer, taille de l'ensemble de valeurs
HexLowerCase [I] boolean, indique si il faut utiliser les caracteres minuscules (true) ou
majuscules (false).
RETOUR :
AnsiString, chaine contenant la representation textuelle des valeurs binaire contenues dans Bin.
vide si BinSize <= 0.
}
function BinToStr(const Bin : TBin; const BinSize: integer; const HexLowerCase: boolean = true): AnsiString;
var pW : p2Bytes;
N : integer;
BI, BH, BL : byte;
const
BIVAL : array[boolean] of byte = ($37, $57);
begin
if BinSize = 0 then
exit;
BI := BIVAL[HexLowerCase];
SetLength(result, BinSize shl 1);
pW := @result[1];
for N := 0 to BinSize-1 do
begin
BH := Bin[N] shr 4;
BL := Bin[N] and $F;
case BH of
$0..$9 : inc(BH, $30);
$A..$F : inc(BH, BI);
end;
case BL of
$0..$9 : inc(BL, $30);
$A..$F : inc(BL, BI);
end;
pW^[0] := BH;
pW^[1] := BL;
inc(pW);
end;
end;
{ ReadBinFromStream
lit les octets d'un flux et les places dans un tableau TBin.
PARAMETRES :
Stream [I] TStream, Instance valide d'une classe TStream
Bin [O] TBin, contient les octets luts du flux
BinSize [I] BinSize, nombres d'octets a lire
RETOUR :
integer, renvois le nombre d'octets copiés dans Bin (>= 1)
0 : BinSize est definit a 0 ou inferieur a 0
-1 : Stream invalide, pas instancié (create)
}
function ReadBinFromStream(Stream: TStream; var Bin: TBin; const BinSize: integer): integer;
begin
result := 0;
if BinSize <= 0 then
exit;
if not assigned(Stream) then
begin
result := -1;
exit;
end;
result := Stream.Read(Bin[0], BinSize);
end;
{ WriteBinToStream
Ecrit les octets contenus dans un tableau TBin dans un flux
PARAMETRES :
Stream [I/O] TStream, Instance valide d'une classe TStream
Bin [I] TBin, contient les octets a ecrire dans le flux
BinSize [I] BinSize, nombres d'octets a ecrire
RETOUR :
integer, renvois le nombre d'octets ecrit dans le flux (>= 1)
0 : BinSize est definit a 0 ou inferieur a 0
-1 : Stream invalide, pas instancié (create)
}
function WriteBinToStream(Stream: TStream; const Bin: TBin; const BinSize: integer): integer;
begin
result := 0;
if BinSize <= 0 then
exit;
if not Assigned(Stream) then
begin
result := -1;
exit;
end;
result := Stream.Write(Bin[0], BinSize);
end;