所以,我需要在程序中计算字节数组,我注意到了奇怪的事情:
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,一切都应该在我的代码中。
答案 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