C# プロジェクトで DriveInfo クラスを使用して、特定のドライブで使用可能なバイトを取得しています。この数値をメガバイトまたはギガバイトに正しく変換するにはどうすればよいですか? 1024で割っても、私が推測する仕事はできません。結果は、Windows エクスプローラーに表示される結果とは常に異なります。
7 に答える
1024 は、プログラムでの使用に適しています。
違いがある理由は、driveinfo が「使用可能なスペース」として報告するものと、使用可能なスペースと見なすウィンドウの違いによる可能性があります。
ドライブ メーカーのみが 1,000 を使用することに注意してください。Windows およびほとんどのプログラムでは、正しいスケーリングは 1024 です。
また、コンパイラはとにかくこれを最適化する必要がありますが、この計算は、大きさごとにビットを 10 ずつシフトするだけで実行できます。
KB = B >> 10
MB = KB >> 10 = B >> 20
GB = MB >> 10 = KB >> 20 = B >> 30
読みやすくするために、1024 による連続した除算がより明確になると思います。
XKCDには明確な答えがあります:

/// <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 は実際には間違っています。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ゾーンですべて読むことができます。
したがって、変換が国際標準に従って正確かつ適切であるためには、この科学的表記法を使用する必要があります。
実際のファイル サイズとディスク上のサイズのどちらが必要かによって異なります。実際のファイル サイズは、ファイルがメモリ内で使用する実際のバイト数です。ディスク上のサイズは、ファイル サイズとディスク/ファイル システムのブロック サイズの関数です。
1000 を使用するか 1024 を使用するかについての答えは、プレフィックスの大文字と小文字にあるというかすかな記憶があります。例: 「科学的」1000 スケーリングが使用される場合、「科学的」単位は kB になります (kg、kN などと同様)。コンピュータ中心の 1024 スケーリングが使用される場合、単位は KB になります。したがって、科学的な接頭辞を大文字にすると、コンピューター中心になります。
1024 で割ります。