我正在与合作伙伴进行集成,该合作伙伴使用 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/