登录
首页 >  Golang >  Go问答

为何在 Go 和 C# 中将字节数组转换为 big int 后得到不同结果?

来源:stackoverflow

时间:2024-03-24 21:12:36 483浏览 收藏

在 Go 和 C# 中将字节数组转换为 big int 会产生不同的结果,原因在于这两个语言对字节数组的处理方式不同。Go 从后往前处理字节数组,而 C# 从前往后处理。这意味着在 Go 中,最高位字节会被赋予最高权重,而在 C# 中,最低位字节会被赋予最高权重。因此,在 Go 中转换的 big int 值会比在 C# 中转换的值大得多。

问题内容

我有一个字节数组,我将其转换为大整型并输出到控制台。

在 C# 中: https://dotnetfiddle.net/eNz1Lg

在 Go 中: https://play.golang.org/p/gXKoEja_8Dd

为什么结果我有不同的数字?

C# 结果: 29063245685294006143166067625254036131869872254473278645853807481306566623231

结果: 115792089237316195423570985008687907852837564279074904382605163141518161494336


解决方案


嗯,bigintegerc#go 中有不同的表示。让我们提供同样易于操作的数组

{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

因此,gobyte[]最后到第一个转换为 biginteger

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)

终于介绍完啦!小伙伴们,这篇关于《为何在 Go 和 C# 中将字节数组转换为 big int 后得到不同结果?》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>