【问题标题】:Convert 0x0000000000000001 from string to long将 0x0000000000000001 从字符串转换为长
【发布时间】:2016-05-30 07:48:27
【问题描述】:

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

0x0000000000000001
0x0000000000000002
0x0000000000000020
0x0000000000040000

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

long t = 0x0000000000040000;

这不会引发异常。

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

我试过了

Convert.ToInt64("0x0000000000040000");

this question建议的那样

我也试过了

long.Parse("0x0000000000040000", NumberStyles.HexNumber);

但这也会引发异常

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

Tl;博士:

有人知道怎么解析吗

string s = "0x0000000000000001"; 

long l = 0x0000000000000001;

?

【问题讨论】:

  • 使用s.Subtring(2),因此您删除了前两个字符0x
  • »但是该数字随后保存为不带零(例如 0x0000000000000001 变为 1),这不是我想要的。« -- 数字是相同的。如果你想在某处写它时以不同的方式格式化它(例如l.ToString("x16")),这是另一点,但你通常不应该关心一个数字在没有任何区别时是如何表示的。
  • @Joey 你是完全正确的。现在我觉得自己很愚蠢......

标签: c# string long-integer


【解决方案1】:

类似这样的:

   String source = "0x0000000000040000";

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

甚至

   long result = Convert.ToInt64(source, 16); 

转换回string

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

【讨论】:

  • Convert.ToInt64(source.TrimStart('0', 'x'), 16)"0x0000000000000000" 有问题。已编辑:从评论中删除了错误的陈述,对不起。
  • @Jeppe Stig Nielsen:你说得对:0x0 是一个反例,我已经编辑了答案:"0" + source.TrimStart('0', 'x')
  • @Dimitry 好答案,但修剪部分完全没有意义,Convert.ToInt64 处理 0x 十六进制前缀就好了。
  • 有趣的是,在我的机器上(.NET 版本 4.5.2),Convert.ToInt64(null, 16) 成功并给出零,而 Convert.ToInt64("", 16) 因“错误”异常而爆炸(预期为 FormatException 但得到了ArgumentOutOfRangeException(从调用堆栈的更深一点))。 编辑: 嗯,我注意到这种行为已记录在案。还是让我吃惊。
【解决方案2】:

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

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

【讨论】:

  • 反例:s = "0x00000FFFF"
  • @DmitryBychenko 我很惊讶你实际上是......对!但我想知道为什么......
  • Convert.ToInt64(s.Substring(2), 16);,请注意16
【解决方案3】:

此代码将十六进制转换为整数并检查无效输入并在处理 0x00 时解析 0x

if (int.TryParse(stringname.TrimStart('0').TrimStart('x'), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out int result))
{
    //use the value of "result"
}
else
{
    //check the input
}

你需要添加

using System.Globalization;

【讨论】:

    猜你喜欢
    • 2014-06-15
    • 2016-03-03
    • 2012-09-19
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    相关资源
    最近更新 更多