【问题标题】:How to correctly convert filesize in bytes into mega or gigabytes?如何正确地将文件大小以字节为单位转换为兆字节或千兆字节?
【发布时间】:2010-10-08 14:51:38
【问题描述】:

我在我的 C# 项目中使用 DriveInfo 类来检索给定驱动器上的可用字节。如何正确将此数字转换为兆字节或千兆字节?我猜除以 1024 不会完成这项工作。结果总是与 Windows-Explorer 中显示的结果不同。

【问题讨论】:

标签: c# byte disk driveinfo megabyte


【解决方案1】:

1024 在程序中使用是正确的。

您可能存在差异的原因可能是由于 driveinfo 报告为“可用空间”的内容和 windows 认为可用空间的差异。

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

此外,尽管您的编译器无论如何都应该对此进行优化,但只需将每个量级的位移动 10 即可完成此计算:

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

虽然为了可读性,我希望连续除以 1024 会更清晰。

【讨论】:

  • 是的,只有驱动器制造商使用基于 1,000 的定义。这就是为什么您的“4.7 GB”驱动器实际上是 4,700,372,992 字节,“50 GB”蓝光只有 50,050,629,632 字节,您的“128 kbps”mp3 实际上是每秒 128,000 位,“3.1 兆像素”相机只有 3,145,728 像素, 2 GHz 处理器实际上是 2,000,000,000 赫兹,16 GB/s 内存总线实际上是每秒 16,000,000 字节,...
  • 1024 只是“正确”的,因为它表示磁盘上的实际位数。但是,如果您担心正确性,则需要使用单位“GiB”来显示它。使用 1024 并将其称为“GB”在技术上是不正确的。 GB官方是10亿,不是10.24亿。我认为从人为因素的角度来看,1000 是正确的用法。 1 吉瓦等于 1000 兆瓦。 1 GHz 是 1000 MHz。出于同样的原因(为了便于人类进行数学计算)1000 GB 就是 1000 MB。
  • 不@Adam,@Bryan 是正确的。当您谈论“驱动器”或“字节”时,标准 SI 前缀意味着不同的东西是没有意义的,它是 10 的幂,而不是 2 的幂。例如当使用 2 的幂时,正确的术语是兆字节,而不是兆字节。
  • @Bryan, @john - 如果您的程序报告的数字与操作系统和其他所有程序不同,用户会抱怨。如果您想要合理的用户体验,您应该认真考虑遵守通用约定。但是,您的程序可以随心所欲地处理,如果您准备好处理客户关于 GiB 是什么的问题,或者为什么您的软件报告的驱动器大小与他们看到的其他所有内容不同,那就去做吧。请记住,SI 前缀非常适合技术文档,但不一定是为最终用户易于理解而设计的。
  • Apple 软件报告文件大小和驱动器存储为 1 GB = 10 亿字节,我想我已经看到其他一些程序也这样做了。当在可寻址空间上节省几位是一件大事并且每个变量除以 1024 比除以 1000 在计算上要便宜得多时,整个千亿 = 1024 的事情就出现了,但是使用现代硬件几乎不会一个区别。不过,真正关心差异并没有太多好处。做任何让你开心的事,因为无论如何都会有人告诉你你错了。
【解决方案2】:

XKCD 有definite answer:

【讨论】:

  • @Adam Davis 对于 ECC RAM,这实际上正是在实践中所做的。
  • 虽然很有趣,但并不能回答问题,可能会使容易混淆的人感到困惑。
  • 有些机器具有非标准架构,每字节位数多于或少于 8 位。我正在考虑每字节 9 位的 UNIVAC 1103/1103A/1105/1100/2200 大型机(以及运行每字节仅使用 6 位的程序的潜力)。所以KBa 将不再是那些机器上的贝克千字节,而是标准。
【解决方案3】:

/// <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"

【讨论】:

    【解决方案4】:

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

    • 1000 字节是一千字节,1000KB 是一兆字节,依此类推。缩写为 KB、MB、GB 等。
    • 广泛使用的 1024 字节 = 1 KB 应改为称为 1024 字节 = 1 千字节 (KiB)、1024 字节 = 1 兆字节 (MiB)、1024 字节 = 1 千兆字节 (GiB) 等等。

    大家可以在IEC SI zone阅读。

    因此,为了使您的转换根据国际标准化正确无误,您应该使用这种科学记数法。

    【讨论】:

    • 标准与否,以不同于主机操作系统的方式报告磁盘使用情况将是荒谬的!
    • 问题在于那些主机操作系统做错了,任何最终用户都想知道为什么他在商店购买的全新磁盘报告的安装次数少于包装盒上打印的内容。
    • re:“以不同于主机操作系统的方式报告磁盘使用情况会很荒谬”:Snow Leopard (Mac OSX 10.6) 使用值 1000 (support.apple.com/kb/TS2419)
    • -1 表示“1024 实际上是错误的”。 IEC 可能会说 1000,但 GNU 会说 1024(尝试在 Linux 中执行 df -h)。看起来IEC只是硬盘制造商的棋子。
    • 使用标准忽略其他! kB 十进制 KB 二进制
    【解决方案5】:

    这取决于您想要实际文件大小还是磁盘大小。实际文件大小是文件在内存中使用的实际字节数。磁盘大小是文件大小和磁盘/文件系统的块大小的函数。

    【讨论】:

      【解决方案6】:

      我隐约记得是使用 1000 还是 1024 的答案在于前缀的大小写。 例子: 如果使用“科学”1000 标度,那么“科学”单位将为 kB(如 kg、kN 等)。如果使用以计算机为中心的 1024 缩放,则单位为 KB。因此,将科学前缀大写使其以计算机为中心。

      【讨论】:

      • KB = 1000 字节,KiB = 1024 字节
      • +1 对于 k 与 K,这是正确的,但当 ISO 前缀的字母已经是大写时,它就无济于事了,例如 Mega、Giga 和 Tera 的 M、G 和 T。许多人,尤其是来自美国的人,倾向于混淆 ISO 单位和前缀的大小写。
      【解决方案7】:

      除以 1024。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-31
        • 1970-01-01
        • 2011-01-22
        • 2023-04-02
        • 2018-06-24
        • 1970-01-01
        • 2016-06-08
        • 1970-01-01
        相关资源
        最近更新 更多