RecalcSizeInfo - изменить представление информации о размерности

Информация о размерности, заданная в байтах, может быть указана в других единицах. Стандарт Международной системы единиц СИ (SI) позволяет пересчитать размер, заданный в байтах, в другие единицы с учетом десятичной степени по следующей схеме:

B    байт                 10^0 = 2^0
KB   килобайт   (Кбайт)   10^3      байт/1000
MB   мегабайт   (Mбайт)   10^6      байт/1000000
GB   гигабайт   (Гбайт)   10^9
TB   терабайт   (Tбайт)   10^12
PB   петабайт   (Пбайт)	  10^15
EB   эксабайт   (Эбайт)	  10^18
ZB   зеттабайт  (Збайт)   10^21	
YB   йоттабайт  (Ибайт)   10^24

Информация размерности, указанная в байтах, в соответствии со стандартами Международной электротехнической комиссии - МЭК (IEC) может быть указана в других единицах с учетом двоичной степени:

KiB  кибибайт             2^10      байт/1024
MiB  мебибайт             2^20      байт/1048576
GiB  гибибайт             2^30           
TiB  тебибайт             2^40
PiB  пебибайт             2^50
EiB  эксбибайт            2^60
ZiB  зебибайт             2^70	
YiB  йобибайт             2^80

Функция RecalcSizeInfo изменяет представление информации о размерности, то есть пересчитывает число байт в число килобайт или кибибайт, мегабайт или мебибайт и так далее или пересчитывает размер в обратную сторону.

Синтаксис

$Result=RecalcSizeInfo($Direct,$Unit,$Size,$Dim=0,$ModeError=rvsTriggerError);

Параметры

$Direct - направление пересчета заданного значения: 
   cdiToBytes=1 - пересчитать килобайты или кибибайты и т.д. в байты; 
   cdiFromBytes=2 - пересчитать байты в килобайты или кибибайты, ...;
$Unit - единица измерения, от которой нужно произвести расчет в байтах или 
   к которой нужно привести исходную величину, заданную в байтах. Всего
   определено 17 единиц B,KB,MB,GB,TB,PB,EB,ZB,YB,KiB,MiB,GiB,TiB,PiB,EiB,ZiB,YiB;
$Size - исходная величина, которая требует пересчета;
$Dim - точность (количество десятичных разрядов) с которой должен быть 
   представлен результат (по умолчанию целочисленный результат);
$ModeError - режим вывода сообщений об ошибке (по умолчанию через 
   исключение с пользовательской ошибкой на сайте doortry.ru)

Возвращаемое значение

$Result - пересчитанное значение размерности (float); текст сообщения об ошибке 
(string) при $ModeError=rvsReturn или true/false в случае успешного/неуспешного 
выполнения функции при $ModeError<>rvsReturn

Зарегистрированные ошибки/исключения

RecalcDirectIncorrect - "Неверно указано направление пересчета";
UnitMeasureIncorrect  - "Неверно указана единица измерения"
<?php namespace prown;
// PHP7/HTML5, EDGE/CHROME                           *** RecalcSizeInfo.php ***
// ****************************************************************************
// * TPhpPrown               Изменить представление информации о размерности, *
// *            то есть пересчитать число байт в число килобайт или кибибайт, *
// *            мегабайт или мебибайт, ... или пересчитать в обратную сторону *
// *                                                                          *
// * v1.1, 11.09.2021                              Автор:       Труфанов В.Е. *
// * Copyright © 2018 tve                          Дата создания:  08.09.2018 *
// ****************************************************************************

require_once 'iniConstMem.php';
require_once 
'iniErrMessage.php';
require_once 
'MakeUserError.php';

// Определяем массив единиц измерения
define ("bunits", array(
    
'B' =>  ** 0,
   
'KB' => 10 ** 3,    // 2  килобайт   (Кбайт)   10^3      байт/1000
   
'MB' => 10 ** 6,    // 3  мегабайт   (Mбайт)   10^6      байт/1000000
   
'GB' => 10 ** 9,    // 4  гигабайт   (Гбайт)   10^9
   
'TB' => 10 ** 12,   // 5  терабайт   (Tбайт)   10^12
   
'PB' => 10 ** 15,   // 6  петабайт   (Пбайт)   10^15
   
'EB' => 10 ** 18,   // 7  эксабайт   (Эбайт)   10^18
   
'ZB' => 10 ** 21,   // 8  зеттабайт  (Збайт)   10^21    
   
'YB' => 10 ** 24,   // 9  йоттабайт  (Ибайт)   10^24
  
'KiB' =>  ** 10,   // 10 кибибайт             2^10      байт/1024
  
'MiB' =>  ** 20,   // 11 мебибайт             2^20      байт/1048576
  
'GiB' =>  ** 30,   // 12 гибибайт             2^30           
  
'TiB' =>  ** 40,   // 13 тебибайт             2^40
  
'PiB' =>  ** 50,   // 14 пебибайт             2^50
  
'EiB' =>  ** 60,   // 15 эксбибайт            2^60
  
'ZiB' =>  ** 70,   // 16 зебибайт             2^70    
  
'YiB' =>  ** 80)); // 17 йобибайт             2^80

// ****************************************************************************
// *   Изменить представление информации о размерности, то есть пересчитать   *
// *   число байт в число килобайт или кибибайт, мегабайт или мебибайт, ...   *
// *                 или пересчитать в обратную сторону                       *
// ****************************************************************************
function RecalcSizeInfo($Direct,$Unit,$Size,$Dim=0,$ModeError=rvsTriggerError)
{
   
// В зависимости от направления пересчитываем значение
   
if ($Direct==cdiToBytes$Result=RecalcToBytes($Unit,$Size,$Dim,$ModeError); 
   else if (
$Direct==cdiFromBytes$Result=RecalcFromBytes($Unit,$Size,$Dim,$ModeError);
   
// Отмечаем ошибку "Неверно указано направление пересчета"
   
else $Result=MakeUserError(RecalcDirectIncorrect.' [$Direct='.$Direct.']','TPhpPrown',$ModeError);
   return 
$Result;
}
// ****************************************************************************
// *           Размер в байтах пересчитать в килобайты или кибибайты,         *
// *                        мегабайты или мебибайты, ...                      *
// ****************************************************************************
function RecalcFromBytes($Unit,$Size,$Dim=0,$ModeError=rvsTriggerError)
{
   
$UnitValue=makeUnit($Unit,$ModeError);
   
// Пересчитываем значение
   
if (gettype($UnitValue)=='integer')
   {
      return 
round($Size/$UnitValue,$Dim);
   }
   
// Отмечаем ошибку "Неверно указана единица измерения"
   
else return $UnitValue;
}
// ****************************************************************************
// *             Размер, представленный в килобайтах или кибибайтах,          *
// *                  мегабайтах или мебибайтах и т.д. в байты                *
// ****************************************************************************
function RecalcToBytes($Unit,$Size,$Dim=0,$ModeError=rvsTriggerError
{
   
$UnitValue=makeUnit($Unit,$ModeError);
   if (
gettype($UnitValue)=='integer')
   {
      return 
round($Size*$UnitValue,$Dim);
   }
   else return 
$UnitValue;
}
// ****************************************************************************
// *              Выбрать значение из массива единиц измерения,               *
// *               соответствующее заданной единице измерения                 *
// ****************************************************************************
function makeUnit($Unit,$ModeError=rvsTriggerError)
{
   
$Result=false;
   
// Выбираем значение из массива единиц измерения
   
foreach(bunits as $k=>$v) if ($k==$Unit$Result=$v;
   
// Отмечаем ошибку "Неверно указана единица измерения",
   
if (!$Result)
   
$Result=MakeUserError(UnitMeasureIncorrect.' [$Unit='.$Unit.']','TPhpPrown',$ModeError);
   return 
$Result;
}

// ***************************************************** RecalcSizeInfo.php *** 


Сообщения выполненного теста функции


RecalcSizeInfo

$Unit="KiB"; $Result=prown\RecalcSizeInfo(cdiFromBytes,$Unit,24962496,2; ....... Изменено представление размера в байтах на кибибайты - 24377.44 KiB
$Unit="KiB"; $Result=prown\RecalcSizeInfo(3,$Unit,24962496,2,rvsReturn); ....... [TPhpPrown] Неверно указано направление пересчета [$Direct=3]
$Unit="MiB"; $Result=prown\RecalcFromBytes($Unit,24962496,2); .................. Изменено представление размера в байтах на мебибайты = 23.806091 MiB
$Unit="YiBi"; $Result=prown\RecalcSizeInfo(cdiFromBytes,$Unit,2,0,rvsReturn); .. [TPhpPrown] Неверно указана единица измерения [$Unit=YiBi]
$Unit="MB"; prown\RecalcFromBytes($Unit,24962496000000,0,rvsReturn); ........... Заменено представление размера на мегабайты = 24962496 MB
$Unit="GB"; prown\RecalcFromBytes($Unit,24962496000000,0,rvsReturn); ........... Заменено представление размера на гигабайты = 24962.5 GB
$Unit="TB"; prown\RecalcFromBytes($Unit,24962496000000,0,rvsReturn); ........... Заменено представление размера на терабайты = 24.96 TB
$Unit="YB"; prown\RecalcFromBytes($Unit,24962496000000,4,rvsReturn); ........... Заменено представление размера на йоттабайты = 1.0E+24 YB
$Unit="B"; prown\RecalcSizeInfo(cdiFromBytes,$Unit,24962496,2); ................ Оставлено представление размера в байтах = 24962496 B

$Unit="MB"; prown\RecalcToBytes($Unit,2.8563,2); ............................... Изменено представление размера в мегабайтах на байты - 2856300 B
$Unit="MiB"; prown\RecalcSizeInfo(cdiToBytes,$Unit,2.8563,2); .................. Изменено представление размера в мебибайтах на байты - 2995047.63 B
$Unit="KiBi"; $Result=prown\RecalcToBytes($Unit,2,0,rvsReturn); ................ [TPhpPrown] Неверно указана единица измерения [$Unit=KiBi]
$Unit="KiB"; $Result=prown\RecalcSizeInfo("Byte",$Unit,2.8563,2,rvsReturn); .... [TPhpPrown] Неверно указано направление пересчета [$Direct=Byte]
$Unit="B"; $Result=prown\RecalcSizeInfo(cdiToBytes,$Unit,2.8563,2); ............ Оставлено представление размера в байтах = 2.86 B

1/1 test cases complete: 18 passes, 0 fails and 0 exceptions.