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