首页 > 解决方案 > 为什么 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# 中转换字符串?

标签: javac#biginteger

解决方案


C#BigInteger将字节数组视为 little-endian:

参数

价值Byte[]

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

而 JavaBigInteger将字节数组视为大端:

将包含 BigInteger 的二进制补码表示的字节数组转换为 BigInteger。输入数组假定为大端字节序:最高有效字节位于第零个元素中。

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

另请注意,JavaString.getBytes使用默认编码,可能不是 ASCII。你应该使用

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

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


推荐阅读