为什么C#和Java BigInteger转换byte[]的方式不同



这是Java代码:

new BigInteger("abc".getBytes()).toString();

结果为6382179

我希望在C#中得到相同的结果,但当我使用以下代码时:

(new System.Numerics.BigInteger(System.Text.Encoding.ASCII.GetBytes("abc"))).ToString();

我得到了6513249

如何以与Java相同的方式在C#中转换字符串?

C#的BigInteger将字节数组视为小端序:

参数

Byte[]

以小端序排列的字节值数组。

而Java的BigInteger将字节数组视为big-endian:

将包含BigInteger的二补二进制表示的字节数组转换为BigInteger。假设输入数组按big-endian字节顺序排列:最高有效字节在第零个元素中。

因此,您需要反转字节数组以获得与其他语言相同的结果。

还要注意,Java的String.getBytes使用默认编码,可能不是ASCII。你应该使用

StandardCharsets.US_ASCII.encode("abc").array()
// or
"abc".getBytes(StandardCharsets.US_ASCII)

以获得与C#代码相同的字节集。

最新更新