问题
我有一个byte[]
转换为十六进制字符串,然后像这样解析该字符串BigInteger.Parse(thatString,NumberSyles.Hexnumber)
。
这似乎很浪费,因为 BigInteger 能够接受一个字节 [],只要考虑到二进制补码。
一个工作(低效)的例子
根据 MSDN,最后一个字节的最高有效位应为零,以便以下十六进制数为正数。以下是存在此问题的十六进制数示例:
byte[] ripeHashNetwork = GetByteHash();
foreach (var item in ripeHashNetwork)
{
Console.Write(item + "," );
}
// Output:
// 0,1,9,102,119,96,6,149,61,85,103,67,158,94,57,248,106,13,39,59,238,214,25,103,246
// Convert to Hex string using this http://stackoverflow.com/a/624379/328397
// Output:
// 00010966776006953D5567439E5E39F86A0D273BEED61967F6`
好的,让我们将该字符串传递给 的静态方法BigInteger
:
BigInteger bi2 = BigInt.Parse(thatString,NumberSyles.Hexnumber);
// Output bi2.ToString() ==
// {25420294593250030202636073700053352635053786165627414518}
既然我有一个数据基线,并且知道有效的转换,我想让它更好/更快/等等。
一个不工作(高效)的例子
byte[]
现在我的目标是往返 aBigInt
并使结果看起来像 25420294593250030202636073700053352635053786165627414518
. 让我们开始吧:
因此,根据 MSDN,我的最后一个字节需要一个零,以避免我的数字被视为二进制的恭维。我将添加零并打印出来以确保:
foreach (var item in ripeHashNetwork)
{
Console.Write(item + "," );
}
// Output:
// 0,1,9,102,119,96,6,149,61,85,103,67,158,94,57,248,106,13,39,59,238,214,25,103,246,0
好的,让我们将其传递byte[]
给 的构造函数BigInteger
:
BigInteger bi2 = new BigInteger(ripeHashNetwork);
// Output bi2.ToString() ==
// {1546695054495833846267861247985902403343958296074401935327488}
如果我不添加尾随零,我跳过的是 bigInt 对我的字节数组所做的示例。发生的事情是我得到一个错误的负数。如果你愿意,我会发布。
那么我做错了什么?