我正在与使用Java BigInteger
的合作伙伴进行集成,以生成字节数组作为简单加密算法的关键。我试图找到相当的.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
值为负值。
我期待着每个人的想法。
答案 0 :(得分:7)
使用LINQ方法评论中提供的I4V可以轻松解决问题。
sbyte[] key = BigInteger.Parse(keyString, NumberStyles.HexNumber).ToByteArray().Reverse().Select(x => (sbyte)x).ToArray();
这将为您提供所需的阵列。 .NET默认使用无符号字节,而Java默认使用带符号字节。它们具有相同的位表示,因此,取决于您正在使用它,实际上可能并不重要,但是,如果您想在.NET中使用真正等效的输出,则需要使用sbytes代替字节,简单地使用字节意味着两种语言之间的不同。
答案 1 :(得分:2)
当我比较2结果时 来自Java:
[72, -73, 52, -38, 71, 56, -116, 101, 105, 19, -55, -65, 81, 70, -31, -122]
来自.Net
[134, 225, 70, 81, 191, 201, 19, 105, 101, 140, 56, 71, 218, 52, 183, 72]
我可以说:
-73
为183
醇>
所以我认为我们可以说结果是一样的,但是需要检查Endianness是否相同并保持符号。
您能否显示打印这些结果的代码?
答案 2 :(得分:2)
看起来.Net的结果与java结果相反,但它们的值相同。然而,.Net字节是无符号的,而不是签名的java字节(包含你注意到的负数)。您可以将获得的结果转换为带符号的字节(sbyte),也可以反转顺序:
sbyte[] finalResult = (sbyte[])(Array)key.Reverse().ToArray();
结果:[72,-73,52,-38,71,56,-116,101,105,19,-55,-65,81,70,-31,-122]
应该注意的是,位表示将是相同的,因此如果您将其用作某些加密的密钥并在位级别上操作它,则可能不需要获取实际的有符号字节(sbyte)但如果你这样做,它可能会更容易想象从java到.Net的转换。