Conversion des unités informatique (o, kio, mio, gio, tio...)

Soyez le premier à donner votre avis sur cette source.

Vue 13 211 fois - Téléchargée 299 fois

Description

Bonjour,

Cette classe utilitaire permet de convertir une taille (d'un fichier) d'une unité à une autre.
De calculer l'unité la taille la plus adapté pour un affichage.

Attention à ne pas confondre les unités de la norme CEI et SI (http://fr.wikipedia.org/wiki/Pr%C3%A9fixe_binaire).
1 ko (kilooctet) = 1000 octets
1 kio (kibioctet) = 1024 octets

Source / Exemple :


<?php

namespace File\Unit;

require_once __DIR__."/Exception.class.php";

/**



class Binary

{

	const OCTET = 1;	const o = 1; 

	const KIBIOCTET = 2; const Kio = 2;

	const MEBIOCTET = 3; const Mio = 3;

	const GIBIOCTET = 4; const Gio = 4;

	const TEBIOCTET = 5; const Tio = 5;

	const PEBIOCTET = 6; const Pio = 6;

	const EXBIOCTET = 7; const Eio = 7;

	const ZEBIOCTET = 8; const Zio = 8;

	const YOBIOCTET = 9; const Yio = 9;

	

	/*______________________________________________________________________________________*/

	/**

  • Teste si l'unité existe.
  • @param Binary::__CONST__ $unit
  • @return bool
  • /
private static function exists($unit) { return ($unit >= self::OCTET && $unit <= self::YOBIOCTET); } /*______________________________________________________________________________________*/ /**
  • Permet de convertir une taille exprimée en octet en bit.
  • @param int $size
  • @param int $defineByte Représentation d'un byte.
  • @return int
  • /
public static function octetToBit($size) { return $size * 8; } /*______________________________________________________________________________________*/ /**
  • Permet de convertir une taille exprimée en bit en octet.
  • @param int $size
  • @return int
  • /
public static function bitToOctet($size) { return $size / 8; } /*______________________________________________________________________________________*/ /**
  • Permet de convertir une taille d'une unité à une autre.
  • @param int $size La taille.
  • @param Binary::__CONST__ $unitFrom L'unité de départ.
  • @param Binary::__CONST__ $unitTo L'unité d'arrivé.
  • @return int La nouvelle taille après conversion.
  • /
public static function convert($size, $unitFrom, $unitTo) { if(!is_numeric($size)) throw new InvalidArgumentException('param $size must be an integer'); if(!self::exists($unitFrom)) throw new InvalidArgumentException('incorrect $unitFrom param'); if(!self::exists($unitTo)) throw new InvalidArgumentException('incorrect $unitTo param'); if($unitFrom === $unitTo) return $size; return self::doConvert($size, $unitFrom, $unitTo); } /*______________________________________________________________________________________*/ private static function doConvert($size, $unitFrom, $unitTo) { $diff = abs($unitTo - $unitFrom); if($diff === 0) throw new RuntimeException('Erreur lors du calcul de l\'unité'); $x = 1024; for($i = 1; $i < $diff; $i++) $x *= 1024; return (($unitFrom < $unitTo)? ($size / $x) : ($size * $x)); } /*______________________________________________________________________________________*/ /**
  • Renvoie la meilleur unité (ex: 2048 octets -> renvoie self::__KIBIOCTET__ car 2 KiB est la meilleur unité.
  • @param int $size La taille.
  • @param Binary::__CONST__ $unit L'unité.
  • @return int La meilleur unité.
  • /
public static function getBestUnit($size, $unit) { $size = self::convert($size, $unit, self::OCTET); if($size >= 1208925819614629174706176) $unit = self::YOBIOCTET; elseif($size >= 1180591620717411303424) $unit = self::ZEBIOCTET; elseif($size >= 1152921504606846976) $unit = self::EXBIOCTET; elseif($size >= 1125899906842624) $unit = self::PEBIOCTET; elseif($size >= 1099511627776) $unit = self::TEBIOCTET; elseif($size >= 1073741824) $unit = self::GIBIOCTET; elseif($size >= 1048576) $unit = self::MEBIOCTET; elseif($size >= 1024) $unit = self::KIBIOCTET; else $unit = self::OCTET; return $unit; } } ?>

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
15
Depusi un peu plus de 10 ans maintenant, il a été défini dans le Système Internationnal que 1 Ko = 1000 octets.
Et que 1Kio = 1024 Octets.
Cette source prend en compte les deux unités.

http://fr.wikipedia.org/wiki/Kilooctet

C'est toujours bien de se renseigner avant de dire des inepties.
Messages postés
16
Date d'inscription
mardi 18 novembre 2003
Statut
Membre
Dernière intervention
23 septembre 2010

1octet = 8bits (0000000000 à 11111111) donc 1Ko = 8 192 bits = 1024 octets (2^10) et non 1000 octets.
N'oublions pas que nous sommes dans les puissances de 2 (2,4,8,16,32,64,128,256,1024....), les machines comptent en base 2 avec des 0 et 1 (éteint ou allumé) et non en base 10.
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
15
Salut,

Deux choses :
1/ Une classe pour faire juste ça, je trouve que c'est un peu excessif (mais ce n'est que mon opinion)
2/ Byte et Octet sont deux choses différentes. Ce n'est pas qu'une question de langue : un Byte est un mot d'une longueur de plusieurs bits (7, 8, 16, ...). En informatique, le plus courant est un Byte de 1 octet, soit 8 bits, mais ce n'est pas systématique. La traduction anglaise de "octet" est... "octet".
http://fr.wikipedia.org/wiki/Byte

Pour mon usage perso, je m'étais fait une eptite fonction que je considère comme étant plus simple et largement suffisante :
function format_size($size, $si = FALSE) {
$units_2 = array('o', 'Kio', 'Mio', 'Gio', 'Tio', 'Pio', 'Eio', 'Zio', 'Yio');
$units_si = array('o', 'Ko', 'Mo', 'Go', 'To', 'Po', 'Eo', 'Zo', 'Yo');

$pow = 0;

if ($si) {
$units = $units_si;
$divisor = 1000;
}
else {
$units = $units_2;
$divisor = 1024;
}

while ($size >= $divisor) {
if ($pow > 8) {
break;
}
$size /= $divisor;
$pow++;
}

return round($size, 2).' '.$units[$pow];
}

Certes, elle ne convertit pas d'une unité en une autre, mais cette fonctionnalité de conversion ne me paraît pas du tout indispensable (autant j'ai déjà été amené à concvertir en octets ou en l'unité la plus grande possible avec la valeur comprise entre 0 et 1023), autant je n'ai jamais eu à convertir d'une unité en une autre, en 13 ans...

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.