Org.BouncyCastle.Math.BigInteger.ToByteArrayUnsigned 的 .NET System.Numerics.BigInteger 等价物是什么?
What is the .NET System.Numerics.BigInteger Equivalent of Org.BouncyCastle.Math.BigInteger.ToByteArrayUnsigned?
我目前正在使用 .NET port of BouncyCastle,但在使用本机 .NET BigInteger
.
将大整数转换为 System.Guid
时遇到了一些问题
对于某些上下文,我在一个 ("source") 应用程序中使用 BouncyCastle 将 System.Guid
转换为 Org.BouncyCastle.Math.BigInteger
。然后将该值保存为 3A2B847A960F0E4A8D49BD62DDB6EB38
.
格式的字符串
然后,在另一个 ("destination") 应用程序中,我正在使用 BigInteger
的这个保存的字符串值,并尝试将其转换回 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)
如您所见,Org.BouncyCastle.Math.BigInteger
上有一个 ToByteArrayUnsigned
方法可以实现此功能。如果我在 System.Numerics.BigInteger
上使用 ToByteArray
(即使在 resizing the array as discussed in this question 时)它也不起作用并且我得到与预期不同的 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!
使用 .NET 的 BigIntegrer 时生成的 Guid 的实际值是多少?
可能这两种实现只是以不同方式存储字节。字节顺序等
查看每个实现的字节数组返回的内容:
var sb = new StringBuilder();
foreach (var b in bytes)
{
sb.AppendFormat("{0:X2} ", b);
}
sb.ToString();
这将是一个有趣的比较。
我会完全避免BigInteger
。您的 data
字节顺序已经正确,因此您可以直接转换为 byte[]
。
var data = "3A2B847A960F0E4A8D49BD62DDB6EB38";
var bytes = new byte[16];
for (var i = 0; i < 16; i++)
bytes[i] = byte.Parse(data.Substring(i * 2, 2), NumberStyles.HexNumber);
var guid = new Guid(bytes); // 7a842b3a-0f96-4a0e-8d49-bd62ddb6eb38
我目前正在使用 .NET port of BouncyCastle,但在使用本机 .NET BigInteger
.
System.Guid
时遇到了一些问题
对于某些上下文,我在一个 ("source") 应用程序中使用 BouncyCastle 将 System.Guid
转换为 Org.BouncyCastle.Math.BigInteger
。然后将该值保存为 3A2B847A960F0E4A8D49BD62DDB6EB38
.
然后,在另一个 ("destination") 应用程序中,我正在使用 BigInteger
的这个保存的字符串值,并尝试将其转换回 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)
如您所见,Org.BouncyCastle.Math.BigInteger
上有一个 ToByteArrayUnsigned
方法可以实现此功能。如果我在 System.Numerics.BigInteger
上使用 ToByteArray
(即使在 resizing the array as discussed in this question 时)它也不起作用并且我得到与预期不同的 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!
使用 .NET 的 BigIntegrer 时生成的 Guid 的实际值是多少?
可能这两种实现只是以不同方式存储字节。字节顺序等
查看每个实现的字节数组返回的内容:
var sb = new StringBuilder();
foreach (var b in bytes)
{
sb.AppendFormat("{0:X2} ", b);
}
sb.ToString();
这将是一个有趣的比较。
我会完全避免BigInteger
。您的 data
字节顺序已经正确,因此您可以直接转换为 byte[]
。
var data = "3A2B847A960F0E4A8D49BD62DDB6EB38";
var bytes = new byte[16];
for (var i = 0; i < 16; i++)
bytes[i] = byte.Parse(data.Substring(i * 2, 2), NumberStyles.HexNumber);
var guid = new Guid(bytes); // 7a842b3a-0f96-4a0e-8d49-bd62ddb6eb38