C# 在.NET中相当于Java BigInteger到字节数组
我正在与一个合作伙伴进行集成,该合作伙伴使用Java的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, -
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第一个字节数组是一个javabyte
数组,是有符号值。第二个是.Netbyte
array,它们不是有符号值。rjygraham,请查看打印内容var s=String.Join(“,”,key.Reverse()。选择(x=>(sbyte)x.ToArray())
OP,你有什么理由不使用sbyte
而不是byte
?endianness是倒序的。谢谢,我完全忘记了sbyte…因为我太专注于Java语法,所以无法看到树的森林。