我创建了一个用于执行单位转换的类,特别是字节到千字节,兆字节,千兆字节等。我有一个enum
B
到PB
,但出于某种原因{{ 1}}不返回1024^0
并且它没有正确地从字节转换为字节或字节转换为千字节等。
这是我的班级:
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)
强制转换为enum
或将int
提升为int
并指定错误时是否会丢失是一个问题到int
,但这是一种奇怪的行为。
答案 0 :(得分: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
}
然后:
long divided = n / (long) constant;
答案 1 :(得分:7)
答案 2 :(得分:6)
^
是一个按位运算符,您目前正在执行&#39; 1024 XOR 0&#39;。
我认为您正在寻找Math.Pow(1024, n);
,这是&#39; 1024提升到0&#39;
答案 3 :(得分:3)
答案 4 :(得分:0)
您应该使用Math.Pow()。
^不用于幂,而是用于按位运算(有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/zkacc7k1.aspx)。