現在、BouncyCastle の .NET ポートをSystem.Guid
使用していますが、ネイティブの .NET を使用して大きな整数を に変換する際に問題が発生していますBigInteger
。
コンテキストによっては、1 つの (「ソース」) アプリケーションで BouncyCastle を使用して を に変換しSystem.Guid
ていOrg.BouncyCastle.Math.BigInteger
ます。この値は、形式で文字列として保存されます3A2B847A960F0E4A8D49BD62DDB6EB38
。
次に、別の(「宛先」)アプリケーションで、この保存された a の文字列値を取得し、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)
ご覧のとおり、これを機能させるToByteArrayUnsigned
メソッドが にありOrg.BouncyCastle.Math.BigInteger
ます。を使用するToByteArray
と(この質問で説明したように配列のサイズ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!