我目前正在使用BouncyCastle 的 .NET 端口,System.Guid
并且在使用本机 .NET将大整数转换为 a 时遇到了一些麻烦BigInteger
。
在某些情况下,我在一个(“源”)应用程序中使用 BouncyCastle 将 a 转换System.Guid
为Org.BouncyCastle.Math.BigInteger
. 然后将该值保存为格式为的字符串3A2B847A960F0E4A8D49BD62DDB6EB38
。
然后,在另一个(“目的地”)应用程序中,我将这个保存的字符串值 aBigInteger
并尝试将其转换回System.Guid
.
请注意,在目标应用程序中,我不希望 BouncyCastle 作为参考,而是希望使用核心 .NET 库进行转换。但是,由于我在使用核心 .NET 类进行转换时遇到问题,因此我使用的是 BouncyCastle,以下代码完全符合我的要求:
var data = "3A2B847A960F0E4A8D49BD62DDB6EB38";
var integer = new Org.BouncyCastle.Math.BigInteger( data, 16 );
var bytes = integer.ToByteArrayUnsigned();
var guid = new Guid( bytes ); // holds expected value: (7A842B3A-0F96-4A0E-8D49-BD62DDB6EB38)
如您所见,有一种ToByteArrayUnsigned
方法Org.BouncyCastle.Math.BigInteger
可以使这项工作。如果我使用ToByteArray
on the System.Numerics.BigInteger
(即使在调整数组大小时,如本问题中所述)它也不起作用,并且我得到的结果与System.Guid
预期的不同。
那么,使用本机 .NET 类执行与上述操作等效的最佳方法是什么?
解决方案
感谢@John-Tasler 的建议,事实证明这是由于字节序……该死的字节序……你的字节序会结束吗?:P
var parsed = System.Numerics.BigInteger.Parse( "3A2B847A960F0E4A8D49BD62DDB6EB38", NumberStyles.HexNumber ).ToByteArray();
Array.Resize( ref parsed, 16 );
var guid = new Guid( parsed.Reverse().ToArray() ); // Hoorrrrayyyy!