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