为什么字节数组在Go和C#中转换为bigint后给出不同的数字?
c#
我有一个字节数组,我将其转换为 big int 并输出到控制台。
在 C# 中:
https : //dotnetfiddle.net/eNz1Lg
在围棋中:
https : //play.golang.org/p/gXKoEja_8Dd
为什么结果我有不同的数字?
C#结果: 29063245685294006143166067625254036131869872254473278645853807481306566623231
去结果: 115792089237316195423570985008687907852837564279074904382605163141518161494336
回答
好吧,在C#和Go 中BigInteger有不同的表示。让我们提供同样易于操作的数组
{0x01, 0x02}
看看发生了什么:
走
var array = []byte{
0x01, 0x02,
}
var seed = new(big.Int).SetBytes(array)
str := seed.String()
fmt.Println(str)
结果是258(注意,258 == 0x01 * 256 + 0x02)
C#
var array = new byte[]
{
0x01, 0x02,
};
var seed = new System.Numerics.BigInteger(array);
Console.WriteLine($"{seed}");
结果是513(注意,513 == 0x01 + 0x02 * 256)
所以Go转换byte[]为BigIntegerfrom last 到 first:
array[array.Length - 1] +
array[array.Length - 2] * 256 +
array[array.Length - 3] * 256 * 256 +
...
array[0] * Pow(256, array.Length - 1)
当C#它从第一到最后:
array[0] +
array[1] * 256 +
array[2] * 256 * 256 +
...
array[array.Length - 1] * Pow(256, array.Length - 1)