如何让BigInteger正确查看此Hex字符串的二进制表示?

时间:2012-12-18 17:39:15

标签: c# biginteger performance twos-complement

问题

我有一个byte[]转换为十六进制字符串,然后该字符串被解析为BigInteger.Parse(thatString,NumberSyles.Hexnumber)

这似乎很浪费,因为BigInteger能够接受一个byte [],只要考虑到二者的补码。


一个有效(低效)的例子

According to 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[]往返BigInt并使结果看起来像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对我的字节数组做的样本,如果我不添加尾随零。会发生什么事情,我得到一个错误的负数。如果你愿意,我会张贴。

那么我做错了什么?

2 个答案:

答案 0 :(得分:2)

当您通过十六进制字符串时,数组的第一个字节将成为生成的BigInteger中最重要的字节。

当您添加尾随零时,数组的最后一个再见是最重要的。

我不确定哪种情况正确,但这就是你得到不同答案的原因。

答案 1 :(得分:2)

从MSDN“值数组中的各个字节应该是小端顺序,从最低位字节到最高位字节”。所以错误就是字节的顺序:

BigInteger bi2 = new BigInteger(ripeHashNetwork.Reverse().ToArray<byte>());