Convertisseur octet

Résolu
Maniaxman Messages postés 155 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 17 juillet 2008 - 25 mars 2005 à 17:37
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 - 31 mars 2005 à 21:19
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

WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
27 mars 2005 à 20:02
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.
3
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
25 mars 2005 à 19:39
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.
0
Maniaxman Messages postés 155 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 17 juillet 2008
27 mars 2005 à 14:09
Est-ce que tu pourrais faire un exemple de convertion pour juste octet -> kilo-octet stp ?

Merci.
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
27 mars 2005 à 14:36
NbKiloOctets := NbOctets div 1024;


@+
Bonne Prog'
Nico



<HR>
N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Maniaxman Messages postés 155 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 17 juillet 2008
27 mars 2005 à 14:48
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?
0
GordoCabron Messages postés 29 Date d'inscription jeudi 16 décembre 2004 Statut Membre Dernière intervention 14 mars 2007
27 mars 2005 à 15:22
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+
0
Maniaxman Messages postés 155 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 17 juillet 2008
27 mars 2005 à 15:26
merci bcp

mais il n'y a pas de solutions pour aller au-dela de Go?
0
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 !
0
Maniaxman Messages postés 155 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 17 juillet 2008
27 mars 2005 à 18:21
mais même, je devrait aller bien plus loin, n'y a t-il pas une autre solution?
0
Maniaxman Messages postés 155 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 17 juillet 2008
27 mars 2005 à 19:48
je ne comprends pas, quand je met integer et int64, le programme ne va pas du tout plus loin, comment ça se fait ?
0
Maniaxman Messages postés 155 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 17 juillet 2008
27 mars 2005 à 21:29
sinon, comment éviter ce message d'erreur dans une opération trop
importante : overflow in conversion or arithmetique operation ?

Merci
0
Maniaxman Messages postés 155 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 17 juillet 2008
27 mars 2005 à 22:21
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)
0
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
28 mars 2005 à 00:02
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.
0
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
28 mars 2005 à 00:22
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.
0
Maniaxman Messages postés 155 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 17 juillet 2008
28 mars 2005 à 11:47
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.
0
Maniaxman Messages postés 155 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 17 juillet 2008
28 mars 2005 à 12:09
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
0
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
28 mars 2005 à 12:54
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.
0
Maniaxman Messages postés 155 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 17 juillet 2008
28 mars 2005 à 17:36
ç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
0
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
28 mars 2005 à 19:20
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.
0
Maniaxman Messages postés 155 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 17 juillet 2008
28 mars 2005 à 19:32
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
0
Rejoignez-nous