从隐含的无符号十六进制字符串构造BigInteger的正确方法是什么
本文关键字:BigInteger 方法 是什么 字符串 无符号 十六进制 | 更新日期: 2023-09-27 18:30:10
我遇到了一个问题,因为我有一个隐含的无符号十六进制数作为字符串,由用户输入提供,需要转换为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
的正确方法是什么?
用"0"前缀十六进制字符串就可以了:
BigInteger.TryParse(string.Format("0{0}", "FFFF"), style, ...)
在上面的例子中,我的BigInteger是65535。
编辑
摘录自BigInteger文档:
在解析十六进制字符串时,NumberStyles)和BigInteger.Parse(String,IFormatProvider)方法假设如果字符串中的第一个字节已设置,或者如果第一个十六进制数字的值表示字节值的低四位值通过使用二的补码表示来表示。对于例如,"FF01"answers"F01"都表示十进制值-255到区分正值和负值,正值应该包括前导零ToString方法的相关重载,当它们被传递"X"格式字符串时,在为正值返回了十六进制字符串。