例如,我有以下字符串:"0x7800001054.1.1.0030"如果这不是字符串,我可以很容易地得到如下值:
ulong myValue = 0x780000105d0e0030;
这给了我86469113554832027696的价值然而,当我想如下解析它时:
var myValue2= Convert.ToInt64("0x780000105d0e0030",16)
这给了我8070450566607667200 的价值
然后,myValue与myValue2不同。myValue是正确的,它应该是这样工作的。我做错了什么?
Int64
是有符号long
。
改为使用Convert.ToUInt64
:
var myValue2= Convert.ToUInt64("0x780000105d0e0030",16);
当myValue
为无符号Int64时,myValue2
为有符号Int64。
您实际需要的是Convert.ToUInt64
函数。
您正在转换的值在Int64的范围内,并转换为等效的Int64值,如以下代码所示:
ulong u = 0x780000105d0e0030;
Console.WriteLine("Convert.ToInt64("0x780000105d0e0030", 16) => {0}", Convert.ToInt64("0x780000105d0e0030", 16));
Console.WriteLine("u => {0}", u);
Console.WriteLine("u.ToString("x") => {0}", u.ToString("x"));
Console.WriteLine("Convert.ToInt64(u.ToString("x"), 16) => {0}", Convert.ToInt64(u.ToString("x"), 16));
Console.WriteLine("u = (ulong)Convert.ToInt64("0x780000105d0e0030", 16)");
u = (ulong)Convert.ToInt64("0x780000105d0e0030", 16);
Console.WriteLine("u => {0}", u);
从而产生以下输出:
Convert.ToInt64("0x780000105d0e0030", 16) => 8646911354832027696
u => 8646911354832027696
u.ToString("x") => 780000105d0e0030
Convert.ToInt64(u.ToString("x"), 16) => 8646911354832027696
u = (ulong)Convert.ToInt64("0x780000105d0e0030", 16)
u => 8646911354832027696
这就留下了两种可能性:
- 你使用的.net版本(我有4.0.30319 RTMRel)在Convert.ToInt64的实现中有一个主要缺陷
- 您将字符串"0x70000000000000000"传递给函数
我的钱会花在后一种解释上。