将十六进制字符串转换为其等效的 BigInteger 取反该值
Converting a hex string to its BigInteger equivalent negates the value
我有一个字符串,它表示一个大的十六进制数,我想将其转换为整数。但是,当我尝试转换时,整数等价物的答案是否定的。这是代码:
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);
已经很久了,但我觉得我应该解释一下原因:
Signed integers use the Most Significant Bit (MSB) indicates whether a value is positive or negative. Although there's more to it than just the msb.
BigInteger
和 long
都是有符号整数:如果十六进制字符串中最高有效数字在 0 (0000
) 和 7 (0111
) 之间, msb 是 0
并且数字是正数。如果是8(1000
)或以上,则msb是1
,数字是负数。
long.Parse
知道您正在解析的类型的大小,即它的十六进制表示是 00009782E78F1636
。 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);
我有一个字符串,它表示一个大的十六进制数,我想将其转换为整数。但是,当我尝试转换时,整数等价物的答案是否定的。这是代码:
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
string hex = "09782E78F1636";
BigInteger b1 = BigInteger.Parse(hex,NumberStyles.AllowHexSpecifier);
Console.WriteLine(b1);
已经很久了,但我觉得我应该解释一下原因:
Signed integers use the Most Significant Bit (MSB) indicates whether a value is positive or negative. Although there's more to it than just the msb.
BigInteger
和 long
都是有符号整数:如果十六进制字符串中最高有效数字在 0 (0000
) 和 7 (0111
) 之间, msb 是 0
并且数字是正数。如果是8(1000
)或以上,则msb是1
,数字是负数。
long.Parse
知道您正在解析的类型的大小,即它的十六进制表示是 00009782E78F1636
。 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);