Convertisseur octet [Résolu]

Messages postés
159
Date d'inscription
lundi 10 janvier 2005
Dernière intervention
17 juillet 2008
- 25 mars 2005 à 17:37 - Dernière réponse :
Messages postés
1270
Date d'inscription
samedi 14 août 2004
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
Afficher la suite 

Votre réponse

29 réponses

Meilleure réponse
Messages postés
1270
Date d'inscription
samedi 14 août 2004
Dernière intervention
5 avril 2012
- 27 mars 2005 à 20:02
3
Merci
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.

Merci WhiteHippo 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 87 internautes ce mois-ci

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

Merci.
Commenter la réponse de Maniaxman
Messages postés
1529
Date d'inscription
samedi 12 juin 2004
Dernière intervention
5 juillet 2010
- 27 mars 2005 à 14:36
0
Merci
NbKiloOctets := NbOctets div 1024;


@+
Bonne Prog'
Nico



<HR>
N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !
Commenter la réponse de ni69
Messages postés
159
Date d'inscription
lundi 10 janvier 2005
Dernière intervention
17 juillet 2008
- 27 mars 2005 à 14:48
0
Merci
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?
Commenter la réponse de Maniaxman
Messages postés
34
Date d'inscription
jeudi 16 décembre 2004
Dernière intervention
14 mars 2007
- 27 mars 2005 à 15:22
0
Merci
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+
Commenter la réponse de GordoCabron
Messages postés
159
Date d'inscription
lundi 10 janvier 2005
Dernière intervention
17 juillet 2008
- 27 mars 2005 à 15:26
0
Merci
merci bcp

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

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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.