Convertir une adresse MAC decimal en une adresse MAC HEXA
wismerhill40
Messages postés11Date d'inscriptionmardi 14 janvier 2003StatutMembreDernière intervention10 mai 2007
-
11 avril 2007 à 15:38
cs_alys
Messages postés1Date d'inscriptionvendredi 13 février 2004StatutMembreDernière intervention 9 avril 2009
-
9 avril 2009 à 01:38
Bonjour,
voila mon probleme: j'ai mon adresse MAC sous le format INT64 et je desire la remettre au format HEXA
cad jai mon int de la forme 9154794631168 et je veux l'avoir sous le format e7:f3:b6:25:11:00
Ne voyez aucune corelations entre les 2 valeurs.
Voila si quelqu'un a une solution je vous en remercie d'avance.
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202237 13 avril 2007 à 04:54
je vois pas ce que je peu ajouter de plus a l'explication de Cirec... si ce n'est que,
quand tu fait une fonction de convertion de ce genre, chiffre vers lettres, lettres vers chiffre, process d'image etc. il faut que ce sois trés rapide.
par contre on considere que les methodes de compression, cryptage, ou lourd traitement video ou 2d/3d peuvent etre lente (cela depend des cas) et donc afficher un etat de progression.
bien sur, une methode qui donne le meme resultat mais plus rapidement sera toujours bienvenue.
moi, je considere que des methodes legere doivent tourner en dessous de 1000ms pour 1MCall, surtout les methodes succeptibles d'etres appélée 10 ou 20 fois ou plus dans une boucle ou une methode.
et encore la on as 125ms sur une config recente qui est prevue pour de la DAO 2d/3d, de la MAO et faire tourner des jeux recents.
alors je te laisse imaginer l'importance de l'optimisation sur des config plus modestes... une methode qui mets presque 10 secondes pour 1 millions d'appels pour ce genre de truc c'est trop :)
meme si ça parrait un peu deroutant de tester 1 millions d'appels, c'est ce qu'on appel un test de charge, ça permet egalement de tester la stabilitée de la methode pour detecter d'eventuel probleme de pointeur ou de fuite memoire ou de debordement.
un peu comme quand on test la charge d'un serveur pour voir si tout vas bien et pour regler les limites.
pour tester c'est simple, voici un petit shema que j'utilise souvent :
procedure TForm1.Button1Click(sender : TObject);
var GT1,GT2, N : cardinal;
begin
GT1 := GetTickCount;
for N := 1 to 1000000 do Methode1; { supposée la plus lente }
GT1 := GetTickCount-GT1;
GT2 := GetTickCount;
for N := 1 to 1000000 do Methode2; { supposée la plus rapide }
GT2 := GetTickCount-GT2;
Label1.caption := format('%d ms VS %d ms [%.2f%%]',
[GT1, GT2, Abs( (100/GT1)*(GT1-GT2) )]);
end;
certe GetTickCount n'est pas le meilleur de la precision, mais quand on as un ecart de 9500 a 125 ... on se rend vite compte
de qui est la plus rapide...
Loulibier
Messages postés309Date d'inscriptionjeudi 6 juin 2002StatutMembreDernière intervention24 septembre 20082 13 avril 2007 à 09:27
Bonjour Foxi,
Merci pour ces informations très intéressante. Effectivement je n'ai jamais testé mes fonctions sur 1 Millions d'appels, mais on se rend bien compte de l'utilité de le faire.
Bonne Prog, Olivier
PS : Lorsqu'une réponse vous convient, n'oubliez pas de la valider.
wismerhill40
Messages postés11Date d'inscriptionmardi 14 janvier 2003StatutMembreDernière intervention10 mai 20071 13 avril 2007 à 12:50
Bonjour a tous !!
Merci pour tout vos conseils et vos reponses super rapides.
jai essayer vos reponses et celles de Foxi marche super. A part que le resultat est inverse a celui d'une adresse MAC. Donc jai modifie le source de Foxi (Desole) je vous la mettrai Lundi si ca vous interresse. mais je dois dire que je me suis fais aider car je ne suis pas a l'aise avec le travail sur les bites. Mais j'ai la meme chose a faire avec l'Adresse IP mais je vais essayer d'y arriver tout seul avec tes sources Foxi !!
Merci a tous !
Vive le monde du libre }:)
Vous n’avez pas trouvé la réponse que vous recherchez ?
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202237 12 avril 2007 à 11:04
houlala, >9500ms/1MCall ... c'est enorme.
version plus rapide (125ms/1MCall) :
function MacStr(const AMac : int64) : string;
var
pR : PChar;
pB : ^byte;
N : integer;
const
BTC : array[$0..$F] of char = '0123456789ABCDEF';
begin
pB := @AMac;
inc(pB,5);
SetLength(Result, 17);
pR := PChar(Result);
for N := 0 to 5 do
begin
pR[0] := BTC[ pB^ shr 4 ];
pR[1] := BTC[ pB^ and $F ];
dec(pB);
inc(pR, 2);
if N < 5 then
begin
pR[0] := '-';
inc(pR,1);
end;
end;
end;
wismerhill40
Messages postés11Date d'inscriptionmardi 14 janvier 2003StatutMembreDernière intervention10 mai 20071 16 avril 2007 à 11:21
Bonjour tout le monde ...
Voila comme promis la fonction dans le bon sens ... Rien de bien nouveau par rapport a celle de Foxi bien entendu !!
function MacStr(const AMac : int64) : string;
var
pR : PChar;
pB : ^byte;
N : integer;
const
BTC : array[$0..$F] of char = '0123456789ABCDEF';
begin
pB := @AMac; {pointe l'@ mac}
inc(pB,5);
SetLength(Result, 17); {chaine de 17 caractères en sortie 6 octets de 2 caractères + 5 sépararteus}
pR := PChar(Result);
inc(pr,15); {pointe le résultat}
for N := 0 to 5 do
begin
if N >0 then
begin
pR[0] := '-';
dec(pR,2);
end;
pR[0] := BTC[ pB^ shr 4 ]; {décale la valeur binaire de @Mac de 4 vers la droite = division par 2^4 soit 16}
pR[1] := BTC[ pB^ and $F ];
dec(pB);
dec(pR, 1);
cs_alys
Messages postés1Date d'inscriptionvendredi 13 février 2004StatutMembreDernière intervention 9 avril 2009 9 avril 2009 à 01:38
Moyennant quelques aménagements, je gagne entre 40 et 45%, suivant les options de compilations et les processeurs, avec :
const BTC : array[$0..$F] of char = '0123456789ABCDEF';
type
oct = packed record a,b,c,d,e,f,g,h: byteend;
poct = ^oct;
function MacStr(const AMac : int64) : str17;
var pR: ; pB: ^byte integer;
begin pB : = pointer(longword(@oct(AMac).f));
result[0] := char(17);
pR := PChar(@Result[15]);
for N : = 0 to 5 do begin pR[1] := BTC[ pB^ shr 4 ];
pR[2] : = BTC[ pB^ and $F ];
if N < 5 then begin pR[0] := '-';
dec(pR, 3);
dec(pB);
end;
end;
end;