在C#中从隐含的无符号十六进制字符串构造Biginteger的正确方法是什么?

时间:2014-11-11 17:44:19

标签: c# biginteger hex ones-complement

我遇到了一个问题,因为我有一个隐含的无符号十六进制数作为字符串,由用户输入提供,需要转换为Biginteger。

由于Biginteger的签名性质,任何输入设置了最高位(0x8 / 1000b),结果数被视为负数。然而,这个问题不能通过简单地检查符号位并乘以-1或由于1的补码得到绝对值而不能解决基础符号来解决,例如将所有值0xF *视为-1。

以下是一些示例输入/输出

var style = NumberStyles.HexNumber | NumberStyles.AllowHexSpecifier;


BigInteger.TryParse("6", style) == 6   // 0110 bin
BigInteger.TryParse("8", style) == -8  // 1000 bin
BigInteger.TryParse("9", style) == -7  // 1001 bin
BigInteger.TryParse("A", style) == -6  // 1010 bin
...
BigInteger.TryParse("F", style) == -1  // 1111 bin
...
BigInteger.TryParse("FA", style) == -6 // 1111 1010 bin
BigInteger.TryParse("FF", style) == -1 // 1111 1111 bin
...
BigInteger.TryParse("FFFF", style) == -1 // 1111 1111 1111 1111 bin

从隐含的无符号十六进制字符串构造Biginteger的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

使用" 0"前缀十六进制字符串应该这样做:

BigInteger.TryParse(string.Format("0{0}", "FFFF"), style, ...)

上例中我的BigInteger为65535。

修改

摘自BigInteger documentation

  

解析十六进制字符串时,BigInteger.Parse(String,   NumberStyles)和BigInteger.Parse(String,NumberStyles,   IFormatProvider)方法假设如果最重要的一点   设置字符串中的第一个字节,或者如果是第一个十六进制数字   字符串表示字节值的低4位,即   值通过使用二进制补码表示来表示。对于   例如," FF01"和" F01"代表十进制值-255。 要   区分正值和负值,正值应该   包括前导零。 ToString方法的相关重载,   当他们通过" X"格式化字符串,将前导零添加到   为正值返回十六进制字符串。