1

問題

16進文字列に変換されたが、byte[]その文字列は次のように解析されますBigInteger.Parse(thatString,NumberSyles.Hexnumber)

2の補数が考慮されている限り、BigIntegerはbyte []を受け入れることができるため、これは無駄に思えます。


実用的な(非効率的な)例

MSDNによると、次の16進数が正の数値になるためには、最後のバイトの最上位ビットがゼロである必要があります。以下は、この問題がある16進数の例です。

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によると、数値が2の補数として表示されないように、最後のバイトにゼロが必要です。ゼロを追加して印刷し、次のことを確認します。

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がバイト配列に対して行うことのサンプルです。何が起こるかというと、私は間違った負の数を取得します。よろしければ投稿します。

だから私は何が間違っているのですか?

4

2 に答える 2

2

16進文字列を使用する場合、配列の最初のバイトが結果のBigIntegerの最上位バイトになります。

末尾のゼロを追加する場合、配列の最後のさようならが最も重要です。

どちらの場合が適切かはわかりませんが、そのため、さまざまな回答が得られます。

于 2012-12-18T18:09:28.033 に答える
2

MSDNから「値配列の個々のバイトは、最下位バイトから最上位バイトまで、リトルエンディアンの順序である必要があります」。したがって、間違いはバイトの順序です。

BigInteger bi2 = new BigInteger(ripeHashNetwork.Reverse().ToArray<byte>());
于 2012-12-18T18:09:38.267 に答える