c# - Java BigInteger 到 .NET 中等效的字节数组

标签 c# java .net biginteger

我正在与合作伙伴进行集成,该合作伙伴使用 Java 的 BigInteger 生成字节数组作为简单加密算法的 key 。我试图找到等效的 .NET 代码,但运气不佳。

他们使用的 Java 代码是:

String keyString = "48B734DA47388C656913C9BF5146E186";
byte key[] = new BigInteger(keyString, 16).toByteArray();

产生以下 byte 数组:

[72, -73, 52, -38, 71, 56, -116, 101, 105, 19, -55, -65, 81, 70, -31, -122]

这本身就很麻烦,因为 .NET 中的 byte 范围是 0-255,所以负值超出了范围。

我想出的最接近的 .NET 代码是:

string keyString = "48B734DA47388C656913C9BF5146E186";
byte[] key = BigInteger.Parse(keyString, NumberStyles.HexNumber).ToByteArray();

产生以下 byte 数组:

[134, 225, 70, 81, 191, 201, 19, 105, 101, 140, 56, 71, 218, 52, 183, 72]

在这一点上,我认为 .NET 等价物根本不可能 - 特别是因为负 byte 值。

期待大家的想法。

最佳答案

使用评论中提供的LINQ方法I4V轻松解决。

  sbyte[] key = BigInteger.Parse(keyString, NumberStyles.HexNumber).ToByteArray().Reverse().Select(x => (sbyte)x).ToArray();

这将为您提供所需的数组。 .NET 默认使用无符号字节,而 Java 默认使用有符号字节。它们具有相同的位表示,因此,根据您使用它所做的事情,使用哪个并不重要,但是,如果您想要在 .NET 中获得真正等效的输出,则需要改用 sbytes字节,因为简单地使用字节在两种语言之间意味着不同的东西。

关于c# - Java BigInteger 到 .NET 中等效的字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16798039/

相关文章:

c# - 如何将泛型类型参数限制为 System.Enum

c# - 寻找 C# URL 路由器,但不是 HTTP

c# - Mvc 4.0 中的存储库模式

java - Spring MVC Controller 方法参数如何工作?

java - Spring @Value 注解中可以指定多个属性名称吗?

c# - PBKDF2 在 .NET 中使用 SHA 256

c# - 在 linq c# 中使用 where 条件对列表进行排序

.net - 需要鼠标滚轮滚动用户控件

.net - 我可以使用 Albacore 任务转换 web.config 吗?

java - 对社交 api 身份验证的抄写员进行故障排除