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,所以负值超出了范围。

我想到的最接近的。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值。

我期待大家的想法

Java BigInteger与.net中的字节数组等效

使用注释中提供的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]

从。net

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

我可以告诉你:

  1. 它们看起来很像- . net只是按反向顺序(java内部表示是大端序的结果)。
  2. 在。net结果中没有负数。
  3. 倒序比较结果表明。net
  4. 中的-73183

所以我认为我们可以说结果是相同的,但需要检查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的转换更容易可视化。