如何使用 C# 和 BigInt 将十六进制转换为十进制?

问题描述 投票:0回答:1

我可以一直重现这 1 行&我不明白为什么 .Net 8 x64 会转换为负小数。由于十六进制大小,必须使用 BigInteger。 转换 URL 事实检查 .Net BigInteger.Parse

BigInteger.Parse("D0752364CFB600E410619304BE135C", System.Globalization.NumberStyles.HexNumber).ToString()

2 示例:


  • 十六进制:9F4F4108B0BC1F2E02662669A635B9C
  • .Net 转换错误:-8032725318385391486974673232284394596
  • 正确转换:13234922614173262479486239732201118620
  • Pad 0 和 .Net 正确转换:0000009F4F4108B0BC1F2E02662669A635B9C
  • .Net 填充 0 转换:也是 13234922614173262479486239732201118620

  • 十六进制:D0752364CFB600E410619304BE135C
  • .Net 转换错误:-246854403100748367549686509950069924
  • 正确转换:1082373592684167505354120550330274652
  • .Net 填充 0 正确转换:也是 1082373592684167505354120550330274652

& 我的列表中还有错误的 .Net BigInteger.Parse 问题。就是涉及 1 行。

周围有人有什么建议吗?

我有解决方法,但我不喜欢马虎的创可贴

.net parsing hex biginteger
1个回答
0
投票

这是记录的行为

如果 value 是十六进制字符串,并且前两个十六进制数字大于或等于 0x80,则

Parse(String, NumberStyles)
方法将 value 解释为使用二进制补码表示形式存储的负数。换句话说,该方法将值中第一个字节的最高位解释为符号位。为了确保将十六进制字符串正确解释为正数,值中的第一个数字必须为零。例如,该方法将 0x80 解释为负值,但它将 0x080 或 0x0080 解释为正值。

所以该方法按照记录的方式工作,只是不是您希望的工作方式。如果您希望该值始终被解释为正值,只需在前面添加“0”即可。

© www.soinside.com 2019 - 2024. All rights reserved.