繁体   English   中英

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

[英]Java BigInteger to byte array equivalent in .NET

我正在与使用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值。

我期待着每个人的想法。

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

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

这将为您提供所需的阵列。 .NET默认使用无符号字节,而Java默认使用带符号字节。 它们具有相同的位表示,因此,取决于您正在使用它,实际上可能并不重要,但是,如果您想在.NET中使用真正等效的输出,则需要使用sbytes代替字节,简单地使用字节意味着两种语言之间的不同。

当我比较Java的2个结果时:

[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的内部表示是Big Endian的结果)。
  2. 在.Net结果中,没有负数。
  3. 以相反顺序比较结果表明-73在.Net中为183

所以我认为我们可以说结果是一样的,但是需要检查Endianness是否相同并保持符号。

你能展示打印出那些结果的代码吗?

看起来.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的转换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM