Convertisseur octet [Résolu]

Signaler
Messages postés
155
Date d'inscription
lundi 10 janvier 2005
Statut
Membre
Dernière intervention
17 juillet 2008
-
Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012
-
salut, j'aimerais créer un programme qui permet convertir un octet, en kilo, en mega, en giga, etc.

et qu'il puisse le faire dans tous les sens, qu'il convertisse kilo en octet ...

Merci
A voir également:

29 réponses

Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012

Bonsoir,
Le probleme de int64 c'est qu'il est limité dans la plage de valeurs -2^63..2^63-1.
Pour aller plus loin il faut passer à des nombres rééls et non plus des nombres entiers.

Voici, une solution :

// Oter ou non le commentaire selon les besoins
//{$DEFINE AVANT_STANDARDISATION}


type
TUnitesOctet = ( uoOctet
, uoKilo
, uoMega
, uoGiga
, uoTera
, uoPeta
, uoExa
, uoZetta
, uoYotta
) ;
const
UNITES_OCTET : array[TUnitesOctet] of string
= ( 'o'
, 'ko'
, 'Mo'
, 'Go'
, 'To'
, 'Po'
, 'Eo'
, 'Zo'
, 'Yo'
) ;

{$IFDEF AVANT_STANDARDISATION}
const
KILOOCTET = 1024.0 ;
{$ELSE}
const
KILOOCTET = 1000.0 ;
{$ENDIF}

const
MEGAOCTET = KILOOCTET * KILOOCTET ;
GIGAOCTET = KILOOCTET * MEGAOCTET ;
TERAOCTET = KILOOCTET * GIGAOCTET ;
PETAOCTET = KILOOCTET * TERAOCTET ;
EXAOCTET = KILOOCTET * PETAOCTET ;
ZETTAOCTET = KILOOCTET * EXAOCTET ;
YOTTAOCTET = KILOOCTET * ZETTAOCTET ;

function ConversionOctets ( Valeur : Extended ; Source, Destination : TUnitesOctet ) : string ;
var
EnOctets : Extended ;
Resultat : Extended ;
begin
// Conversion de la valeur en la plus petite unité l'octet
case Source of
uoOctet : EnOctets := Valeur ;
uoKilo : EnOctets := Valeur * KILOOCTET ;
uoMega : EnOctets := Valeur * MEGAOCTET ;
uoGiga : EnOctets := Valeur * GIGAOCTET ;
uoTera : EnOctets := Valeur * TERAOCTET ;
uoPeta : EnOctets := Valeur * PETAOCTET ;
uoExa : EnOctets := Valeur * EXAOCTET ;
uoZetta : EnOctets := Valeur * ZETTAOCTET ;
uoYotta : EnOctets := Valeur * YOTTAOCTET ;
end ;


// Conversion de la valeur dans l'unité souhaitées
case Destination of
uoOctet : Resultat := EnOctets ;
uoKilo : Resultat := EnOctets / KILOOCTET ;
uoMega : Resultat := EnOctets / MEGAOCTET ;
uoGiga : Resultat := EnOctets / GIGAOCTET ;
uoTera : Resultat := EnOctets / TERAOCTET ;
uoPeta : Resultat := EnOctets / PETAOCTET ;
uoExa : Resultat := EnOctets / EXAOCTET ;
uoZetta : Resultat := EnOctets / ZETTAOCTET ;
uoYotta : Resultat := EnOctets / YOTTAOCTET ;
end ;


// Formattage de la chaine de sortie
Result := Format( '%.10g ' + UNITES_OCTET[Source] + '= %.10g ' + UNITES_OCTET[Destination], [Valeur,Resultat] ) ;
end ;


Exemples d'appel :

var
S : string ;

// Conversion de teraoctets en octets
S := ConversionOctets( 65536 , uoTera , uoOctet ) ;

procedure TForm1.Button1Click(Sender: TObject);
var
S : string ;
begin
S := '' ;
S := S + ConversionOctets( 65536 , uoOctet , uoOctet ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoOctet , uoKilo ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoOctet , uoMega ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoOctet , uoGiga ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoOctet , uoTera ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoOctet , uoPeta ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoOctet , uoExa ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoOctet , uoZetta ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoOctet , uoYotta ) + #13#10 ;
S := S + #13#10 ;
S := S + ConversionOctets( 65536 , uoOctet , uoOctet ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoKilo , uoOctet ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoMega , uoOctet ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoGiga , uoOctet ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoTera , uoOctet ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoPeta , uoOctet ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoExa , uoOctet ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoZetta , uoOctet ) + #13#10 ;
S := S + ConversionOctets( 65536 , uoYotta , uoOctet ) + #13#10 ;


Memo1.Text := S ;
end;

Cordialement.
Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012

Avant la standardisation de décembre 1998 :



<LI>Un KiloOctet (ko) ou KiloByte (kB) 210 octets 1024 octets </LI>
<LI>Un MégaOctet (Mo) ou MégaByte (MB) 220 octets 1024 ko = 1 048 576 octets </LI>
<LI>Un GigaOctet (Go) ou GigaByte (GB) 230 octets 1024 Mo = 1 073 741 824 octets </LI>
<LI>Un TéraOctet (To) ou TeraByte(TB) 240 octets 1024 Go = 1 099 511 627 776 octets</LI>
Depuis décembre 1998, les unités standardisées par IEC sont :



<LI>Un KiloOctet (ko) ou KiloByte (kB) = 1000 octets </LI>
<LI>Un MégaOctet (Mo) ou MégaByte (MB) 1000 ko 1 000 000 octets </LI>
<LI>Un GigaOctet (Go) ou GigaByte (GB) 1000 Mo 1 000 000 000 octets </LI>
<LI>Un TéraOctet (To) ou TeraByte(TB) 1000 Go 1 000 000 000 000 octets</LI>
Il existe également le kilo binaire (kibi), le méga binaire (Mébi), le giga binaire (Gibi), le tera binaire (Tebi).

<LI>Un Kibioctet (kio) ou KibiByte (kiB) vaut 210 = 1024 octets
<LI>Un MébiOctet (Mio) ou MébiByte(MiB) vaut 220 =1 048 576 octets
<LI>Un GibiOctet (Gio) ou GibiByte(GiB) vaut 230 =1 073 741 824 octets
<LI>Un TébiOctet (Tio) ou TébiByte(TiB) vaut 240 =1 099 511 627 776 octets </LI>
Voir http://physics.nist.gov./cuu/Units/binary.html

Il suffit donc de multiplier ou de diviser soit par n fois 1024 (ancienne norme) soit par n fois 1000 (nouvelle norme) pour obtenir chacune des unités.
1To 1000 Go 1000*1000 Mo = 1000 * 1000 * 1000 ko = 1000 * 1000 * 1000 * 1000 * octets
1 octet 1/1000 ko 1/(1000*1000) Mo = etc....

Cordialement.
Messages postés
155
Date d'inscription
lundi 10 janvier 2005
Statut
Membre
Dernière intervention
17 juillet 2008

Est-ce que tu pourrais faire un exemple de convertion pour juste octet -> kilo-octet stp ?

Merci.
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
9
NbKiloOctets := NbOctets div 1024;


@+
Bonne Prog'
Nico



<HR>
N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !
Messages postés
155
Date d'inscription
lundi 10 janvier 2005
Statut
Membre
Dernière intervention
17 juillet 2008

ok, et j'ai deux edit, comment puis-je faire pour que automatiquement,
quand j'entre un nombre dand le edit1, le résultat apparaisse dans le
edit2?
Messages postés
29
Date d'inscription
jeudi 16 décembre 2004
Statut
Membre
Dernière intervention
14 mars 2007

Salut
Une possibilite :
//------------------------------------------------------------------
procedure TForm1.Edit1Change(Sender: TObject);
var valeur,unite:integer;
begin
try
valeur:=StrToInt(Edit1.Text);


unite:=0;
while ((valeur shr (10+unite))<>0) do
unite:=unite+10;
case unite of
0 : Edit2.Text:=IntToStr(valeur shr unite)+' Octets';
10 : Edit2.Text:=IntToStr(valeur shr unite)+' Ko';
20 : Edit2.Text:=IntToStr(valeur shr unite)+' Mo';
30 : Edit2.Text:=IntToStr(valeur shr unite)+' Go';
end;
except
Edit2.Text:='Erreur';
end;


end;
//------------------------------------------------------------------

Un entier est sur 32 bit donc pas possible d'avoir de To
(au max 4Go, d'ou la limitation de la FAT32)

bonne prog
a+
Messages postés
155
Date d'inscription
lundi 10 janvier 2005
Statut
Membre
Dernière intervention
17 juillet 2008

merci bcp

mais il n'y a pas de solutions pour aller au-dela de Go?
avec un Int64 (entier signé sur 64 bits), tu devrais pouvoir aller plus loin


@+
Bonne Prog'
Nico



<HR>
N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !
Messages postés
155
Date d'inscription
lundi 10 janvier 2005
Statut
Membre
Dernière intervention
17 juillet 2008

mais même, je devrait aller bien plus loin, n'y a t-il pas une autre solution?
Messages postés
155
Date d'inscription
lundi 10 janvier 2005
Statut
Membre
Dernière intervention
17 juillet 2008

je ne comprends pas, quand je met integer et int64, le programme ne va pas du tout plus loin, comment ça se fait ?
Messages postés
155
Date d'inscription
lundi 10 janvier 2005
Statut
Membre
Dernière intervention
17 juillet 2008

sinon, comment éviter ce message d'erreur dans une opération trop
importante : overflow in conversion or arithmetique operation ?

Merci
Messages postés
155
Date d'inscription
lundi 10 janvier 2005
Statut
Membre
Dernière intervention
17 juillet 2008

WhiteHippo, ton code me plait, mais comment puis-je faire pour que le résultat apparaisse uniquement dans un edit.



Par exemple, dans le edit1.text je met le nombre 1

et quand je clique sur ok, dans le edit2.text j'obtienne 1000 Mo (convertion de giga en mega)
Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012

2 etapes :

Modification du formattage :
// Formattage de la chaine de sortie
Result := Format( '%.10g ' + UNITES_OCTET[Destination], [Resultat] ) ;

Appel :

Edit2.Text := ConversionOctets( StrToInt(Edit1.Txt), uoGiga , uoMega ) ;

Cordialement.
Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012

Appel :

Je pense qu'il faudrait mieux utiliser StrToFloat à la place de StrToInt, ainsi tu pourras saisir des nombres réels dans ton Edit1.

Edit2.Text := ConversionOctets( StrToFloat(Edit1.Txt), uoGiga , uoMega ) ;

Cordialement.
Messages postés
155
Date d'inscription
lundi 10 janvier 2005
Statut
Membre
Dernière intervention
17 juillet 2008

Ok, merci WhiteHippo, et quand je fais une
grosse convertion (tera vers octet avec "1" dans le edit1), a la fin de
mon edit, je trouve ceci : 1,099511628E012 o

comment arriver a un résultat comme celui-ci : 1 099 511 627 776 ?

Mais pas un arrondi.
Messages postés
155
Date d'inscription
lundi 10 janvier 2005
Statut
Membre
Dernière intervention
17 juillet 2008

bon, j'ai un autre petit problème :



-sur ma fiche, j'ai deux séries de RadioButton avec "octet", "kilo", "mega", ...

une pour la valeur de départ et une pour la valeur d'arrivée



comment faire pour qu'en fonction des RadioButton que je sélectionne, l'opération soit différente ?

Je pensais a un truc de ce genre : Edit2.Text := ConversionOctets(StrToFloat(Edit1.Text), depart , arrivee) ;

et depart correspondrait a Giga si je coche le RadioButton Giga, et
arrivee correspondrait a mega si je coche le RadioButton Mega dans le
deuxième liste.



Merci
Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012

Vu que des réels sont utilisés, tu ne peux pas avoir 1 099 511 627 776, mais un arrondi.

RadioButton ou RadioGroup ? J'opterais pour la seconde solution.
Tu rajoutes un radioGroup dans la propriété items tu ajoutes toutes les unités dans l'ordre du TUnitesOctet, tu initialises itemIndex à 0 (par exemple) Il suffit alors de récuperer à l'aide de ItemIndex l'unité de départ et celle d'arrivée.

Exemple :
Edit2.Text := ConversionOctets(StrToFloat(Edit1.Text), TUnitesOctet(RadioGroupDepart.ItemIndex), TUnitesOctet(RadioGroupArrivee.ItemIndex)) ;

Cordialement.
Messages postés
155
Date d'inscription
lundi 10 janvier 2005
Statut
Membre
Dernière intervention
17 juillet 2008

ça marche, merci WhiteHippo, une dernière chose, comment faire pour que dans edit1 on ne puisse entrer que des chiffres et une virgules, et que les nombres n'apparaissent pas comme ça : 1234567890,4545458 mais comme ça : 1 234 567 890,4545458

et pour l'arrondi, c'est obligatoire?
dans la calculette de windows, on met des nombres bcp plus grands sans arrondis
Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012

Sur l'evenement OnKeyDown du TEdit, il faut intercepter les caractères pour ne permettre que les chiffres, et la virgule. Lorsqu'une virgule est saisie, on le mémorise et on interdit la saisie de cette nouvelle virgule.


Pour l'affichage avec des séparateurs, il suffit de modifier la chaine de format en utilisant %.10n au lieu de %.10f

Pour l'arrondi, oui, puisque l'on travailles avec des réels.

Maintenant, si tu as le temps, tu peux toujours créer un nouveau type non natif qui corresponde mieux à tes besoins et qui puisse gérer les nombres entiers et réels comme la calculette windows :)

Cordialement.
Messages postés
155
Date d'inscription
lundi 10 janvier 2005
Statut
Membre
Dernière intervention
17 juillet 2008

j'ai mis ceci :

If Not(Key in ['0'..'9']) Then Key := #0;

mais on peut hélas rajouter la virgule, ce qui entraine un pb