この行を C++ から C# に移植していますが、経験豊富な C++ プログラマーではありません。
unsigned int nSize = BN_num_bytes(this);
.NET ではSystem.Numerics.BigInteger を使用しています
BigInteger num = originalBigNumber;
byte[] numAsBytes = num.ToByteArray();
uint compactBitsRepresentation = 0;
uint size2 = (uint)numAsBytes.Length;
BigInt が等しい場合、ソースの単体テストの結果が一致しないため、内部での動作方法に根本的な違いがあると思います。
- 0
- 任意の負の数
- 0x00123456
私は文字通り何も知りませんBN_num_bytes
(編集: コメントは、それが BN_num_bits のマクロであることを教えてくれました)。
質問
コードに関するこれらの推測を検証しますか?
BN_num_bytes
マクロであるポートを移植する必要があり((BN_num_bits(bn)+7)/8)
ます(ありがとう@WhozCraig)私は移植する必要があり
BN_num_bits
ますfloor(log2(w))+1
次に、先頭と末尾のバイトがカウントされない可能性がある場合、ビッグ/リトル エンディアン マシンではどうなりますか? それは問題ですか?
Security.StackExchangeに関するこれらの回答に基づいて、私のアプリケーションはパフォーマンスが重要ではないため、.NET の既定の実装を使用し、同等の回避策を既に実装している可能性のある代替ライブラリを使用しない場合があります。
編集:これまでのところ、私の実装は次のようになっていますが、コメントに記載されている「LookupTable」が何であるかはわかりません。
private static int BN_num_bytes(byte[] numAsBytes)
{
int bits = BN_num_bits(numAsBytes);
return (bits + 7) / 8;
}
private static int BN_num_bits(byte[] numAsBytes)
{
var log2 = Math.Log(numAsBytes.Length, 2);
var floor = Math.Floor(log2);
return (uint)floor + 1;
}
編集2:
さらに検索した結果、次のことがわかりました。
BN_num_bits は、指定された bignum の有効ビット数を返すのではなく、最上位 1 ビットの位置を返します。これは必ずしも同じではありません。
そのソースがどうなっているのかはまだわかりませんが…。