C# 将十六进制字符串转换为其等效的BigInteger将对该值求反
我有一个字符串,它表示一个大的十六进制数,我想把它转换成一个整数。但是,当我尝试转换时,等效整数的答案是否定的。代码如下:C# 将十六进制字符串转换为其等效的BigInteger将对该值求反,c#,biginteger,C#,Biginteger,我有一个字符串,它表示一个大的十六进制数,我想把它转换成一个整数。但是,当我尝试转换时,等效整数的答案是否定的。代码如下: string hex = "9782E78F1636"; BigInteger b1 = BigInteger.Parse(hex, NumberStyles.AllowHexSpecifier); 如何获得正确的结果?请尝试以下操作: var b1 = BigInteger.Parse("0" + hex, NumberStyles.HexNumber); 请记住,
string hex = "9782E78F1636";
BigInteger b1 = BigInteger.Parse(hex, NumberStyles.AllowHexSpecifier);
如何获得正确的结果?请尝试以下操作:
var b1 = BigInteger.Parse("0" + hex, NumberStyles.HexNumber);
请记住,您需要在十六进制字符串前加上0。
如果第一个数字在8-F之间,您将得到一个负数。您需要在字符串前加0。当这个数字与
long.Parse一起使用时,如果第一个数字在8-F之间,则使用BigInt可以得到一个负数
string hex = "09782E78F1636";
BigInteger b1 = BigInteger.Parse(hex,NumberStyles.AllowHexSpecifier);
Console.WriteLine(b1);
已经很久了,但我觉得我应该解释一下原因:
使用最高有效位(MSB)指示值是正值还是负值
biginger
和long
都是有符号整数:如果十六进制字符串中的最高有效数字介于0(0000
)和7(0111
)之间,则msb为0
,数字为正。如果是8(1000
)或更高,则msb为1
,数字为负数
long.Parse
知道要解析的类型的大小,即它的十六进制表示形式是0000978E78F1636
。msb是0
,因此它是非常正的
BigInt
不像long那样大小固定。如果你给它9782E78F1636
它不知道你的意思与00001782E78F1636
相同。它认为这种类型只是比较短。它期望一个有符号的值,它认为您的意思是9(1001
)的第一位是符号。在前面的09782E78F1636
中添加一个零可以清楚地表明MSL位是0
,而1001
只是实际值的一部分。您的前导字符介于8和F之间,这意味着作为有符号数字,它是负数。这对于BigInteger并不特殊,它适用于所有整数类型。这是它们在二进制中表示负数的方式;使用最高有效位
对于大多数类型,MSB的位置取决于类型的大小,前提是使用所有位。如果第一个字符介于8和F之间,则会得到一个负数
string b = "91";
SByte b1 = SByte.Parse(b, System.Globalization.NumberStyles.AllowHexSpecifier);
Console.WriteLine("{0}={1}", b, b1);
string s = "9123";
Int16 s1 = Int16.Parse(s, System.Globalization.NumberStyles.AllowHexSpecifier);
Console.WriteLine("{0}={1}", s, s1);
string i = "91234567";
Int32 i1 = Int32.Parse(i, System.Globalization.NumberStyles.AllowHexSpecifier);
Console.WriteLine("{0}={1}", i, i1);
string l = "9123456789012345";
Int64 l1 = Int64.Parse(l, System.Globalization.NumberStyles.AllowHexSpecifier);
Console.WriteLine("{0}={1}", l, l1);
BigInteger不一定很大,它的大小是任意的,它将使用足够的字节来匹配给定的数字,因此要填充它的字节并设置MSB,使其为负数,它只是遇到的第一个字符。如果您的数字未签名,则需要在字符串开头添加0
string big = "91";
BigInteger big1 = BigInteger.Parse(big, System.Globalization.NumberStyles.AllowHexSpecifier);
Console.WriteLine("{0}={1}", big, big1);
可以肯定吗numberstyle.HexNumber
返回为-114886490253770
。你认为你将如何成为一个积极的人?你的预期输出是什么?为什么?@SonerGönül,问题很清楚:预期结果是正数,因为指定的十六进制数是正数。如果第一个数字在8-F之间,biginger.Parse
将返回一个负数,这是一个缺乏文档证明且不明显的方法行为。@DavidArno它的第一个字符是9,因此如果它是有符号整数,我希望它是负数。是的,我这样做了。var str=b1.ToString();为什么要切换到NumberStyles.HexNumber
?这里不需要这样做,因为只有当要解析的字符串包含空格时才需要这样做