将十六进制字符串转换为其等效的 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.

BigIntegerlong 都是有符号整数:如果十六进制字符串中最高有效数字在 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);