C# 将0x0000000000000001从字符串转换为长字符串

C# 将0x0000000000000001从字符串转换为长字符串,c#,string,long-integer,C#,String,Long Integer,我有一个csv文件,它以以下格式存储长值: 0x0000000000000001 0x0000000000000002 0x0000000000000020 0x0000000000040000 我想将值保存在长变量中。 我可以直接保存数据,例如: long t = 0x0000000000040000; 这不会引发异常 但是,我似乎无法将该格式从字符串(从csv文件中读取)转换为长格式 我试过了 Convert.ToInt64("0x0000000000040000"); 如中所述 我也

我有一个csv文件,它以以下格式存储长值:

0x0000000000000001
0x0000000000000002
0x0000000000000020
0x0000000000040000
我想将值保存在长变量中。 我可以直接保存数据,例如:

long t = 0x0000000000040000;
这不会引发异常

但是,我似乎无法将该格式从字符串(从csv文件中读取)转换为长格式

我试过了

Convert.ToInt64("0x0000000000040000");
如中所述

我也试过了

long.Parse("0x0000000000040000", NumberStyles.HexNumber);
但这也带来了一个例外

当我去掉前面的0x时,我可以解析它。 但随后保存的数字中没有零(例如0x0000000000000001变为1),这不是我想要的

Tl;博士:

有人知道如何解析吗

string s = "0x0000000000000001"; 

类似这样的内容:

   String source = "0x0000000000040000";

   long result = Convert.ToInt64("0" + source.TrimStart('0', 'x'), 16);
甚至

   long result = Convert.ToInt64(source, 16); 
要转换回
字符串

   String back = String.Format("0x{0:x16}", result);

一种选择是,您可以使用
子字符串
方法简单地省略转换的前两个字符:

string s = "0x0000000000040000";
long l = Convert.ToInt64(s.Substring(2), 16);

可能重复使用
s.substring(2)
,因此您删除了前两个字符
0x
»,但随后保存的数字没有零(例如0x0000000000000001变为1),这不是我想要的。«——数字是相同的。如果你想在某个地方编写时以不同的格式(例如,
l.ToString(“x16”)
),这是另一点,但你通常不应该关心数字在没有任何区别的情况下是如何表示的。@Joey你完全正确。现在我觉得自己很愚蠢……或者这样:
Convert.ToInt64(source.TrimStart('0','x'),16)
“0x0000000000000000”
有问题。编辑:从评论中删除了错误的陈述,对不起。@Jeppe Stig Nielsen:你说得很对:
0x0
是一个反例,我编辑了答案:
“0”+源代码。TrimStart('0','x')
@Dimitry回答得很好,但修剪部分完全没有意义,
Convert.ToInt64
可以很好地处理
0x
十六进制前缀。有趣的是,在我的机器(.NET版本4.5.2)上,
Convert.ToInt64(null,16)
成功并给出零,而
Convert.ToInt64(“,16)
出现“错误”异常(应为
FormatException
,但获得了
ArgumentOutOfRangeException
(从调用堆栈中的更深层点))。编辑:嗯,我注意到此行为已记录在案。我仍然感到惊讶。反例:
s=“0x00000FFFF”
@DmitryBychenko我很惊讶你实际上是…对的!但我想知道为什么…
将.Convert.ToInt64(s.Substring(2),16);
,请注意16
string s = "0x0000000000040000";
long l = Convert.ToInt64(s.Substring(2), 16);