c# - 如何让 BigInteger 正确地看到这个十六进制字符串的二进制表示?

标签 c# biginteger performance twos-complement

问题

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

这似乎很浪费,因为 BigInteger 能够接受字节 [],只要考虑到二进制补码即可。


一个有效(低效)的例子

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 在我不添加尾随零的情况下对我的字节数组执行的操作的示例。发生的事情是我得到一个错误的负数。如果你愿意,我会发布。

那我做错了什么?

最佳答案

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

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

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

关于c# - 如何让 BigInteger 正确地看到这个十六进制字符串的二进制表示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13938483/

相关文章:

c# - Npgsql + Dapper ExecuteReader

c# - 为 Visual Studio 安装 Hyper-V 模拟器时出错

c# - Object.GetType() 的性能

c# - Newtonsoft.Json 用于反序列化的自定义根名称

c# - 在Linq-to-SQL插入过程中,自增主键值什么时候可用?

java - 变量改变值而不在代码中改变它

java - 带 BigIntegers 的斐波那契计算器

java - 在 Java 中使用 BigIntegers 进行 BitShifting

Mysql Casting Performance Benchmark问题/数据架构

python - Pandas/Python - 使用 stack() groupby() 和 apply() 的性能非常慢