Как правильно преобразовывать размер в байтах в мега или гигабайтах?
Я использую класс DriveInfo в моем проекте C# для извлечения доступных байтов на заданных дисках. Как правильно преобразовать это число в Мега-или гигабайты? Деление на 1024 не сделает работу, я думаю. Результаты всегда отличаются от результатов, показанных в Проводнике Windows.
7 ответов
1024 правильно для использования в программах.
причина, по которой у вас могут быть различия, вероятно, связана с различиями в том, что driveinfo сообщает как "доступное пространство" и что windows считает доступным пространством.
обратите внимание, что только производители дисков используют 1,000. В windows и большинстве программ правильное масштабирование-1024.
кроме того, хотя ваш компилятор должен оптимизировать это в любом случае, этот расчет можно сделать, просто сдвинув биты на 10 для каждого величина:
KB = B > > 10
MB = KB > > 10 = B > > 20
ГБ = МБ > > 10 = КБ > > 20 = Б > > 30
хотя для читаемости я ожидаю, что последовательное деление на 1024 будет более ясным.
/// <summary>
/// Function to convert the given bytes to either Kilobyte, Megabyte, or Gigabyte
/// </summary>
/// <param name="bytes">Double -> Total bytes to be converted</param>
/// <param name="type">String -> Type of conversion to perform</param>
/// <returns>Int32 -> Converted bytes</returns>
/// <remarks></remarks>
public static double ConvertSize(double bytes, string type)
{
try
{
const int CONVERSION_VALUE = 1024;
//determine what conversion they want
switch (type)
{
case "BY":
//convert to bytes (default)
return bytes;
break;
case "KB":
//convert to kilobytes
return (bytes / CONVERSION_VALUE);
break;
case "MB":
//convert to megabytes
return (bytes / CalculateSquare(CONVERSION_VALUE));
break;
case "GB":
//convert to gigabytes
return (bytes / CalculateCube(CONVERSION_VALUE));
break;
default:
//default
return bytes;
break;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return 0;
}
}
/// <summary>
/// Function to calculate the square of the provided number
/// </summary>
/// <param name="number">Int32 -> Number to be squared</param>
/// <returns>Double -> THe provided number squared</returns>
/// <remarks></remarks>
public static double CalculateSquare(Int32 number)
{
return Math.Pow(number, 2);
}
/// <summary>
/// Function to calculate the cube of the provided number
/// </summary>
/// <param name="number">Int32 -> Number to be cubed</param>
/// <returns>Double -> THe provided number cubed</returns>
/// <remarks></remarks>
public static double CalculateCube(Int32 number)
{
return Math.Pow(number, 3);
}
//Sample Useage
String Size = "File is " + ConvertSize(250222,"MB") + " Megabytes in size"
1024 на самом деле неправильно. Международное инженерное сообщество (МЭК) разработало стандарт в 2000 году, который, к сожалению, игнорируется компьютерной промышленностью. Этот стандарт в основном говорит, что
- 1000 байт килобайт, 1000КБ один МБ и так далее. Сокращения: КБ, МБ, ГБ и так далее.
- широко используемые 1024 байта = 1 килобайт должны вместо этого вызываться 1024 байта = 1 Кибибайт( КИБ), 1024 КИБ = 1 Мебибайт( МИБ), 1024 МИБ = 1 Гибибайт (гиб) и так далее.
вы все можете прочитать его на IEC SI zone.
поэтому, чтобы ваши преобразования были правильными и правильными в соответствии с международной стандартизацией, вы должны использовать эту научную нотацию.
Это зависит от того, хотите ли вы фактический размер файла или размер на диске. Фактический размер файла-это фактическое количество байтов, которые файл использует в памяти. Размер на диске-это функция размера файла и размера блока для вашего диска/файловой системы.
У меня есть слабое воспоминание, что ответ о том, чтобы использовать 1000 или 1024 лежит в корпусе приставки. Образец: Если используется масштабирование" scientific "1000, то" научная " единица будет kB (так же, как в kg, kN и т. д.). Если используется компьютерное масштабирование 1024, то блок будет КБ. Так, uppercasing научный префикс делает его компьютерной модели.