2013-08-20 54 views
1

我创建做单位转换一类,特别字节来千字节,兆字节,千兆字节,等等。我与B一个enum通过PB,但由于某些原因1024^0不返回1,它不是正确地从字节转换为字节或字节为千字节等X不计算为1

这里是我的类:

public static class UnitConversion 
{ 
    /// <summary> 
    /// 1024^n 
    /// </summary> 
    public enum ByteConversionConstant 
    { 
     B = 0, 
     KB = 1, 
     MB = 2, 
     GB = 3, 
     TB = 4, 
     PB = 5 
    } 

    public static string GetValueFromBytes(long bytes, 
          ByteConversionConstant constant) 
    { 
     int n = (int)constant; 
     long divisor = 1024^n; 
     return (bytes/divisor).ToString() + 
       Enum.GetName(typeof(ByteConversionConstant), constant); 
    } 
} 

下面的语句应该返回完全相同的值fileInfo.Length,但由于1024^0不返回1,它显示的是千字节数。请注意,我在一行中都使用了GetValueFromBytes方法,但是我将它分开以查看可能导致错误计算的原因。

UnitConversion.GetValueFromBytes(fileInfo.Length, 
           UnitConversion.ByteConversionConstant.B) 

我不知道这是否是与铸造enumint或者如果有什么问题引发一个int时的int并将其分配给一个long丢失,但是这是奇怪的行为。

回答

15

您使用the ^ operator,这是乘方运算符。它是“异或”的。

使用Math.Pow用于幂 - 或更好,只是用在这种情况下位移位:

long divided = bytes >> (n * 10); 
return divided.ToString() + ...; 

或者,你可以改变你的枚举值和实际值的划分:

public enum ByteConversionConstant : long 
{ 
    B = 1L << 0, 
    KB = 1L << 10, 
    MB = 1L << 20, 
    GB = 1L << 30, 
    TB = 1L << 40, 
    PB = 1L << 50 
} 

Then:

long divided = n/(long) constant; 
+0

感谢您指出这一点。我不确定我是如何混淆了'Math.Pow'和按位操作符'^'。 –

7

^XOR运营商。你想通过Math.Pow完成。

+2

那么我们得到了Skeet'd。 –

+0

@Pierre:哈哈的确如此。 –

+1

+1,因为你们先回答了 – AlexDev

6

^是一个按位运算符,您目前正在执行'1024 XOR 0'。

我认为你正在寻找Math.Pow(1024, n);,这是“1024幂0”

3

^ operator doe s不会将这个数字提高到这个数字,它就是Bitwise XOR运营商。

你想Math.Pow

long divisor = Math.Pow(1024, n);