使用BigInteger进行C#字节数组计算无法正常工作

时间:2018-12-08 19:01:23

标签: c# arrays byte biginteger calculation

所以,我需要在程序中计算字节数组,我注意到了奇怪的事情:

        string aaa = "F8F9FAFBFCFD";
        string aaaah = "10101010101";
        BigInteger dsa = BigInteger.Parse(aaa, NumberStyles.HexNumber) + BigInteger.Parse(aaaah, NumberStyles.HexNumber);
        MessageBox.Show(dsa.ToString("X"));

当我添加aaa + aaah时,它显示9FAFBFCFDFE,但它应该显示F9FAFBFCFDFE,但是当我减去它时,它显示正确,aaa-aaah,显示F7F8F9FAFBFC,一切都应该在我的代码中。

1 个答案:

答案 0 :(得分:1)

BigInteger.Parse"F8F9FAFBFCFD"解释为负数-7,722,435,347,203(使用二进制补码),而不是您可能期望的273,752,541,363,453。

来自documentation for BigInteger.Parse

  

如果value是十六进制字符串,则Parse(String, NumberStyles)   方法将value解释为通过使用两个数字存储的负数   补码表示形式,如果其前两个十六进制数字为   大于或等于0x80。换句话说,该方法解释   value中第一个字节的最高位作为符号位。

要获得预期的结果,请在aaa前面加上0强制将其解释为正值:

string aaa = "0F8F9FAFBFCFD";
string aaaah = "10101010101";
BigInteger dsa = BigInteger.Parse(aaa, NumberStyles.HexNumber)
               + BigInteger.Parse(aaaah, NumberStyles.HexNumber);
MessageBox.Show(dsa.ToString("X")); // outputs 0F9FAFBFCFDFE