我正在将此行从 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 位的位置,不一定是同一件事
虽然我仍然不知道它的来源是什么......