2

現在、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!

4

2 に答える 2

2

.NET の BigIntegrer を使用したときに得られる Guid の実際の値は?

2 つの実装では、バイトの格納方法が異なるだけである可能性があります。エンディアンネスなど

各実装のバイト配列から何が返されるかを確認するには:

var sb = new StringBuilder();

foreach (var b in bytes)
{
    sb.AppendFormat("{0:X2} ", b);
} 
sb.ToString();

面白い比較になります。

于 2016-02-21T23:12:33.040 に答える
1

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
于 2016-02-22T08:00:03.347 に答える