PHP – Byte dönüştürme fonksiyonu (Convert bytes)

php-code
Şu an yeni bir site üzerinde çalışıyorum ve dosya/klasör işlemleri için kullandığım bazı fonksiyonların ufak oldukları kadar işlevsel de olduklarını düşünüp sitede yayınlamaya karar verdim. Byte dönüştürme de faydalı olduğunu düşündüğüm fonksiyoncuklardan biri ve adı üstünde dosya byte değerini farklı formatlarda ifade etmeye yarıyor (1024 Kb->1 Mb, 1 Gb->1024 Mb gibi).

Fonksiyon içeriği:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function byteFormat($bytes, $unit = "", $decimals = 2) {
    $units = array('B' => 0, 'KB' => 1, 'MB' => 2, 'GB' => 3, 'TB' => 4,
            'PB' => 5, 'EB' => 6, 'ZB' => 7, 'YB' => 8);
    $value = 0;
    if ($bytes > 0) {
        // Generate automatic prefix by bytes
        // If wrong prefix given
        if (!array_key_exists($unit, $units)) {
            $pow = floor(log($bytes)/log(1024));
            $unit = array_search($pow, $units);
        }
 
        // Calculate byte value by prefix
        $value = ($bytes/pow(1024,floor($units[$unit])));
    }
 
    // If decimals is not numeric or decimals is less than 0
    // then set default value
    if (!is_numeric($decimals) || $decimals < 0) {
        $decimals = 2;
    }
 
    // Format output
    return sprintf('%.' . $decimals . 'f '.$unit, $value);
  }

Fonksiyonun kullanımı:

1
2
3
4
5
6
7
8
9
echo byteFormat(4096, "B") ."\n";
echo byteFormat(8, "B", 2) . "\n";
echo byteFormat(1, "KB", 5) . "\n";
echo byteFormat(1073741824, "B", 0) . "\n";
echo byteFormat(1073741824, "KB", 0) . "\n";
echo byteFormat(1073741824, "MB") . "\n";
echo byteFormat(1073741824) . "\n";
echo byteFormat(1073741824, "TB", 10) . "\n";
echo byteFormat(1099511627776, "PB", 6) . "\n";

Kaynak: if-not-true-then-false.com
Düzenleme için Umut‘a teşekkürler.

Facebook Yorumları

7 Yorum

  1. UB

    Sayıyı strlen fonksyionu ile karakter sayısına göre algılatmak pek akıl karı olmamış. Onun yerine öncelikle is_numeric() ile sayısal olduğunun kontrolü yapılmalı, daha sonra sayı (int)$sayi ile integer’a cast edilmeli ve daha sonra if($sayi < 1024) gibi kontroller ile boyut kontrolünün yapılması daha sağlıklı sonuçlar üretecektir.
    Çünkü 1000 Byte 1KB değil, 1024 Bayt 1KB eder ve 1000 de 1024 de strlen 4’e denk gelir.
     
    Mutlu yıllar. 🙂

  2. Caner
    Yazar

    Php manual üzerinde yayınlanan bir kodu da tekzip ettin ya tebrik ediyorum seni 🙂 Ben de matematik konusunda pek iyi değilimdir fakat yinede neden 1024/1024 yerine 1048576 gibi bir ifade kullanmamışlar diye kıllanmış ve fakat bi bildikleri vardır diye düşünmüştüm.

     

    Eh artık madem düzelttin kodun mantıklı halini de bizimle paylaşırsın herhalde Umutcum 🙂

     

    Mutlu yıllar.

  3. UB

    Unutmazsam yarın yapayım. Muhtemelen strlen’in kullanımına örnek için koymuşlardır onu PHP.net’e .
     
    Mutlu yıllar

  4. UB

    http://www.if-not-true-then-false.com/2009/12/format-bytes-with-php-b-kb-mb-gb-tb-pb-eb-zb-yb-converter/
    Buradaki 1024’ün üstlerine göre işlem yapan ve bu yüzden 1000’e göre işlem yapmadığından tam anlamıyla doğru çalışan bir kod örneği.
    3242536 gibi bir sayı değil de 1024 / 1024 yazmalarının tek nedeni, kodun anlaşılır olmasını istemeleri olsa gerek. Çünkü aynı işlemi PHP çalışırken yapacak. Hani kolay görülsün, anlaşılsın diye.
     
    Öyle işte.
     
    Mutlu yıllar tekrardan.
     
     
     

  5. Arkadaşım, bayt ile gigabayt arasındaki değerler sırasıyla şöyle; gigabayt, megabayt, kilobayt, bayt. Bir basamak aşağıya atlamak istediğinde elindeki değeri her zaman 1024 ile çarpıyorsun. Dolayısı ile 1gb = 1024mb, 1mb = 1024kb … şeklinde elde ettiğin her değeri 1024 ile çarptığın sürece istediğin birimde çevrilmiş değerin ne olacağını bulabilirsin.

Uyarı: Yorumlarda link kullanmayınız. Link içeren yorumlar otomatik olarak spam kabul edilmektedir.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir