如何正确地将文件大小字节转换为兆字节或千兆字节?

Mat*_*ats 21 c# byte disk driveinfo megabyte

我在我的C#项目中使用DriveInfo类来检索给定驱动器上的可用字节.如何正确地将此数字转换为兆字节或千兆字节?除以1024将无法完成我的工作.结果总是与Windows资源管理器中显示的结果不同.

Ada*_*vis 48

1024对于程序中的使用是正确的.

您可能存在差异的原因可能是由于driveinfo报告为"可用空间"以及Windows认为可用空间的差异.

请注意,只有驱动器制造商使用1,000.在Windows和大多数程序中,正确的缩放是1024.

此外,虽然您的编译器无论如何都应该优化它,但是这个计算可以通过仅为每个幅度移位10来完成:

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

虽然为了便于阅读,我预计连续除以1024会更清楚.

  • 1024只是"正确的",因为它代表磁盘上的实际位数.但是,如果您担心正确性,则需要使用单位"GiB"显示.使用1024并将其称为"GB"在技术上是不正确的.GB正式1000万,而不是1024万.从人为因素的角度来看,我认为1000是正确的用法.1千兆瓦是1000兆瓦.1 GHz是1000 MHz.出于同样的原因(并且为了人类更容易的数学),1000千兆字节是1000兆字节. (3认同)
  • Apple 软件将文件大小和驱动器存储报告为 1 GB = 10 亿字节,我想我已经看到其他一些程序也这样做了。整个kilo- = 1024 的事情出现的时候,在可寻址空间上节省几位是一件大事,并且每个变量除以 1024 节省几位比除以 1000 在计算上要便宜得多,但是使用现代硬件,它几乎没有有区别。不过,通过关心差异确实没有什么好处。做任何让你开心的事情,因为有些人无论如何都会告诉你你错了。 (2认同)

sta*_*lue 24

XKCD有明确的答案:

KB的单一,权威标准

  • 有趣的是,它没有回答这个问题,可能会让那些容易混淆的人感到困惑. (18认同)

小智 11

1024实际上是错误的.国际工程界(IEC)在2000年制定了一项标准,令人遗憾地被计算机行业所忽视.这个标准基本上就是说

  • 1000字节是千字节,1000KB是1 MB,依此类推.缩写为KB,MB,GB等.
  • 广泛使用的1024字节= 1千字节应该被称为1024字节= 1 Kibibyte(KiB),1024 KiB = 1 Mebibyte(MiB),1024 MiB = 1 Gibibyte(GiB)等等.

您可以在IEC SI区域读取它们.

因此,为了使您的转换正确并且符合国际标准化,您应该使用这种科学记数法.

  • 标准或否,以与主机操作系统不同的方式报告磁盘使用情况是荒谬的! (2认同)
  • 回复:“以不同于主机OS的方式报告磁盘使用情况是荒谬的”:Snow Leopard(Mac OSX 10.6)使用值1000(http://support.apple.com/kb/TS2419) (2认同)
  • -1表示“ 1024实际上是错误的”。IEC可能会说1000,但是GNU会说1024(尝试在Linux中执行`df -h`)。看来IEC只是硬盘制造商的典当。 (2认同)

AZ_*_*AZ_ 11

/// <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"
Run Code Online (Sandbox Code Playgroud)