Java BigInteger与.net中的字节数组等效
本文关键字:字节数 数组 字节 BigInteger net Java | 更新日期: 2023-09-27 18:15:39
我正在与合作伙伴进行集成,该合作伙伴使用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
s范围从0-255,所以负值超出了范围。
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方法可以方便地解决这个问题。
sbyte[] key = BigInteger.Parse(keyString, NumberStyles.HexNumber).ToByteArray().Reverse().Select(x => (sbyte)x).ToArray();
. net默认使用无符号字节,而Java默认使用有符号字节。它们具有相同的位表示,因此,取决于您对它所做的事情,实际上使用哪个可能并不重要,但是,如果您希望在。net中获得真正等效的输出,则需要使用字节而不是字节,因为简单地使用字节在两种语言之间意味着不同的东西。 当我比较2个结果from Java:
[72, -73, 52, -38, 71, 56, -116, 101, 105, 19, -55, -65, 81, 70, -31, -122]
[134, 225, 70, 81, 191, 201, 19, 105, 101, 140, 56, 71, 218, 52, 183, 72]
我可以告诉你:
- 它们看起来很像- . net只是按反向顺序(java内部表示是大端序的结果)。
- 在。net结果中没有负数。
- 倒序比较结果表明。net 中的
-73
是183
所以我认为我们可以说结果是相同的,但需要检查Endianness是相同的,并且保持了符号。
你能展示一下打印这些结果的代码吗?
看起来来自。net的结果与java的结果相反,但它们是相同的值。然而,. net字节是无符号的,而java字节是有符号的(如您所注意到的,包含负数)。您可以将获得的结果转换为有符号字节(sbyte),也可以反转顺序:
sbyte[] finalResult = (sbyte[])(Array)key.Reverse().ToArray();
结果:[52岁的72、-73、-38、71、56岁,-116年,101年,105年,19日,-55年,-65年,81年,70年,-31年,-122年)
应该注意的是,位表示将是相同的,所以如果您使用它作为某些加密的密钥并在位级别上操作它,您可能不需要获得实际的带符号字节(sbyte),但如果您这样做,它可能会使从java到。net的转换更容易可视化。