字节到人类可读的字符串

时间:2016-01-28 13:16:46

标签: c# .net c#-4.0

我使用以下代码将字节转换为人类可读的文件大小。但 它没有给出准确的结果。

public static class FileSizeHelper
{
    static readonly string[] SizeSuffixes = { "bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB" };
    public static string GetHumanReadableFileSize(Int64 value)
    {
        if (value < 0) { return "-" + GetHumanReadableFileSize(-value); }
        if (value == 0) { return "0.0 bytes"; }

        int mag = (int)Math.Log(value, 1024);
        decimal adjustedSize = (decimal)value / (1L << (mag * 10));

        return string.Format("{0:n2} {1}", adjustedSize, SizeSuffixes[mag]);
    }
}

用法:

FileSizeHelper.GetHumanReadableFileSize(63861073920);

返回59.48 GB
但是,如果我使用谷歌转换器转换相同的字节,它会给63.8GB 知道代码中有什么问题吗?

Goolge截图:

Google screenshot

@RenéVogt和@bashis感谢您的解释。最后使用以下代码

使其正常工作
public static class FileSizeHelper
{
    static readonly string[] SizeSuffixes = { "bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB" };
     const long byteConversion = 1000;
    public static string GetHumanReadableFileSize(long value)
    {

        if (value < 0) { return "-" + GetHumanReadableFileSize(-value); }
        if (value == 0) { return "0.0 bytes"; }

        int mag = (int)Math.Log(value, byteConversion);
        double adjustedSize = (value / Math.Pow(1000, mag));


        return string.Format("{0:n2} {1}", adjustedSize, SizeSuffixes[mag]);
    }
}

2 个答案:

答案 0 :(得分:4)

关于如何显示字节总是有点混乱。如果结果是您想要实现的结果,那么您的代码是正确的。

您从Google展示的内容是十进制表示。正如您所说1000m = 1km,您可以说1000byte = 1kB

另一方面,存在1k = 2^10 = 1024的二进制表示。这些表示称为kibiBytes, Gibibytes etc

您选择的代表取决于您或您客户的要求。只要明白你用来避免混淆。

答案 1 :(得分:2)

如果您希望收到gibibytes,结果是正确的。但是,Google会向您发送gigabytes

区别在于提供x个字节,您获得x / (1000 * 1000 * 1000)千兆字节和x / (1024 * 1024 * 1024)个千兆字节。