web-dev-qa-db-ja.com

バイト単位のファイルサイズをメガバイトまたはギガバイトに正しく変換するにはどうすればよいですか?

C#プロジェクトのDriveInfoクラスを使用して、特定のドライブで利用可能なバイトを取得しています。この数値をメガバイトまたはギガバイトに正しく変換するにはどうすればよいですか? 1024で除算しても、私が推測する仕事はできません。結果は常にWindowsエクスプローラーに表示されるものとは異なります。

21
Mats

プログラムでの使用には1024が適切です。

違いがあるのは、driveinfoが「利用可能なスペース」として報告する内容と、利用可能なスペースと見なされるウィンドウの違いが原因である可能性があります。

ドライブメーカーのみが1,000を使用することに注意してください。 Windowsおよびほとんどのプログラム内では、正しいスケーリングは1024です。

また、コンパイラーはこれをとにかく最適化する必要がありますが、この計算は、大きさごとにビットを10シフトするだけで実行できます。

KB = B >> 10
MB = KB >> 10 = B >> 20
GB = MB >> 10 = KB >> 20 = B >> 30

読みやすくするために、1024での連続的な除算はより明確になると思います。

48
Adam Davis

XKCDには 明確な答え があります。

Single, definitive standard for KB

24
starblue
/// <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"
12
AZ_

1024は実際には間違っています。 International Engineering Community(IEC)は2000年に標準を開発しましたが、コンピューター業界では悲しくも無視されています。この基準は基本的には

  • 1000バイトはキロバイト、1000KBは1 MBなどです。省略形は、KB、MB、GBなどです。
  • 広く使用されている1024バイト= 1キロバイトは、代わりに1024バイト= 1キビバイト(KiB)、1024 KiB = 1メビバイト(MiB)、1024 MiB = 1ギビバイト(GiB)などと呼ばれます。

IEC SIゾーン で読むことができます。

したがって、変換が国際標準化に従って正しく正しく行われるようにするには、この科学表記法を使用する必要があります。

11
grover

実際のファイルサイズが必要か、ディスク上のサイズが必要かによって異なります。実際のファイルサイズは、ファイルがメモリ内で使用する実際のバイト数です。ディスク上のサイズは、ファイルサイズとディスク/ファイルシステムのブロックサイズの関数です。

4
EBGreen

1000と1024のどちらを使用するかについての答えは、プレフィックスの大文字と小文字の区別にあるという、かすかな記憶があります。例:「科学的」1000スケーリングが使用される場合、「科学的」単位はkBになります(kg、kNなどと同様)。コンピューター中心の1024スケーリングが使用されている場合、単位はKBになります。したがって、科学接頭辞を大文字にすると、コンピュータ中心になります。

1
Anders

1024で除算します。

0
Fabian Vilers