十六进制转十进制的问题,

infinite2016 2016-05-06 10:56:30
 string[] hex = new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F" };

string input = "81C519DE36FE0CCA";

long output = 0;
string temp = "";

for (int i = 0; i <= input.Length - 1; i++)
{
temp = input[i].ToString();
for (int n = 0; n <= hex.Length - 1; n++)
{
if (temp == hex[n])
{
output += (long)((Math.Pow(16, input.Length - 1 - i)) * n);
break;
}
}
}
Console.WriteLine(output);


HEX长度大于16位得到的结果是负数
-9095835430208795446


这是在WINDOWS计算器上得到的结果
9350908643500756882

一晚上了没找到问题···

...全文
149 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2016-05-07
  • 打赏
  • 举报
回复

所以无论你在循环中
output += (ulong)((Math.Pow(16, input.Length - 1 - i)) * n);

output = (output << 4) + (ulong)n;

还是 MSDN 介绍的
string input = "81C519DE36FE0CCA";
UInt64 num = UInt64.Parse(input, System.Globalization.NumberStyles.AllowHexSpecifier);
结果都是一致的

当然,long 是有符号整数,算出负数是正常的
threenewbee 2016-05-07
  • 打赏
  • 举报
回复
引用 2 楼 zjoymuhon 的回复:
[quote=引用 1 楼 caozhy 的回复:] long溢出了
我把数据类型改成decimal后没有负数了 但是得到的结果和计算器的结果不一致 CF7002D2D0E46120 14947450267713729212 计算器的结果 14947450267713692868 [/quote] 应该是计算误差造成的。
zjoymuhon 2016-05-07
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
long溢出了
我把数据类型改成decimal后没有负数了 但是得到的结果和计算器的结果不一致 CF7002D2D0E46120 14947450267713729212 计算器的结果 14947450267713692868
qq_34146540 2016-05-07
  • 打赏
  • 举报
回复
引用 4 楼 xuzuning 的回复:
所以无论你在循环中 output += (ulong)((Math.Pow(16, input.Length - 1 - i)) * n); 或 output = (output << 4) + (ulong)n; 还是 MSDN 介绍的 string input = "81C519DE36FE0CCA"; UInt64 num = UInt64.Parse(input, System.Globalization.NumberStyles.AllowHexSpecifier); 结果都是一致的 当然,long 是有符号整数,算出负数是正常的
谢谢你了,居然两行代码就可以搞定,我还傻逼兮兮的重新写了一个方法实现。。
threenewbee 2016-05-06
  • 打赏
  • 举报
回复
long溢出了

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧