C# 在.NET中相当于Java BigInteger到字节数组

C# 在.NET中相当于Java BigInteger到字节数组,c#,java,.net,biginteger,C#,Java,.net,Biginteger,我正在与一个合作伙伴进行集成,该合作伙伴使用Java的biginger生成一个字节数组作为简单加密算法的密钥。我正试图在没有太多运气的情况下找到等效的.NET代码 他们使用的Java代码是: String keyString = "48B734DA47388C656913C9BF5146E186"; byte key[] = new BigInteger(keyString, 16).toByteArray(); 这将生成以下字节数组: [72, -73, 52, -38, 71, 56, -

我正在与一个合作伙伴进行集成,该合作伙伴使用Java的
biginger
生成一个字节数组作为简单加密算法的密钥。我正试图在没有太多运气的情况下找到等效的.NET代码

他们使用的Java代码是:

String keyString = "48B734DA47388C656913C9BF5146E186";
byte key[] = new BigInteger(keyString, 16).toByteArray();
这将生成以下
字节
数组:

[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中的
byte
s的范围为0-255,因此负值超出范围

我想到的最接近的.NET代码是:

string keyString = "48B734DA47388C656913C9BF5146E186";
byte[] key = BigInteger.Parse(keyString, NumberStyles.HexNumber).ToByteArray();
这将生成以下
字节
数组:

[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等价物根本是不可能的——特别是因为负的
byte


我期待着大家的想法。

当我比较两个结果时 来自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]

我可以说:

  • 它们看起来很相似-.Net的顺序正好相反(java的内部表示是Big-Endian的结果)
  • 在.Net结果中,不存在负数
  • 按相反顺序比较结果表明,
    -73
    在.Net中是
    183
  • 所以我认为我们可以说结果是一样的,但是需要检查结果是否相同,并且标志是否保持不变


    可以显示打印这些结果的代码吗?

    看起来.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的转换更容易可视化。

    使用注释中提供的LINQ方法I4V可以轻松地解决这个问题

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

    这将为您提供所需的阵列。NET默认使用无符号字节,而Java默认使用有符号字节。它们具有相同的位表示形式,因此,根据您使用它所做的操作,使用哪一种可能并不重要,但是,如果您希望在.NET中获得真正等效的输出,则需要使用sbytes而不是bytes,因为简单地使用byte意味着两种语言之间的不同

    尝试附加
    .Cast().ToArray()
    ToByteArray()之后
    。应该可以工作。
    生成以下字节数组
    -这不是字节数组。在任何情况下,它都是一个
    System.SByte[]
    @HighCore第一个字节数组是一个java
    byte
    数组,是有符号值。第二个是.Net
    byte
    array,它们不是有符号值。rjygraham,请查看打印内容
    var s=String.Join(“,”,key.Reverse()。选择(x=>(sbyte)x.ToArray())
    OP,你有什么理由不使用
    sbyte
    而不是
    byte
    ?endianness是倒序的。谢谢,我完全忘记了sbyte…因为我太专注于Java语法,所以无法看到树的森林。