2009-08-30 5 views
3

guidを整数の集合として表現したいのであれば、どのように変換するのですか?私はguidのバイト配列表現を取得し、元のGUIDに戻すことができる可能な限り最小の32ビット整数に分割するという考え方に基づいて考えています。コード例が好ましい...Guidを整数の集合として表現する

また、結果の整数配列の長さはどのくらいですか?

答えて

4

どういうわけか私はこのようにしてもっと楽しくやりました。

byte[] bytes = guid.ToByteArray(); 
int[] ints = new int[bytes.Length/sizeof(int)]; 
for (int i = 0; i < bytes.Length; i++) { 
    ints[i/sizeof(int)] = ints[i/sizeof(int)] | (bytes[i] << 8 * ((sizeof(int) - 1) - (i % sizeof(int)))); 
} 

バック変換:

byte[] bytesAgain = new byte[ints.Length * sizeof(int)]; 
for (int i = 0; i < bytes.Length; i++) { 
    bytesAgain[i] = (byte)((ints[i/sizeof(int)] & (byte.MaxValue << 8 * ((sizeof(int) - 1) - (i % sizeof(int))))) >> 8 * ((sizeof(int) - 1) - (i % sizeof(int)))); 
} 
Guid guid2 = new Guid(bytesAgain); 
+1

+1これまでのところ、私はこれが一番好きです。依存関係はありません。 – grenade

+0

それを答えとしてマークすることができます。 :D – Botz3000

1

通常、Guidは128ビットの数字です。

- C#で、あなたはビルド中のGuid構造が十分ではないでしょう

byte[] b = Guid.NewGuid().ToByteArray(); 
+0

を、これは[0-3]それは例えば、バイト4つの整数で表すことができるわけない...バイトを[12-15]? – grenade

+1

はい、そうです。 –

+0

バイト配列を4つの整数に変換するにはどうすればよいですか? – koumides

2

経由で16のバイトを得ることができるので、

を編集しますか?

コンストラクタ:

public Guid(
    byte[] b 
) 

そして、このインスタンスの値が含まれている16-要素バイト配列を返し

public byte[] ToByteArray() 

バイトを整数にパッキングし、その逆も簡単です。

5
System.Guid guid = System.Guid.NewGuid(); 
    byte[] guidArray = guid.ToByteArray(); 

    // condition 
    System.Diagnostics.Debug.Assert(guidArray.Length % sizeof(int) == 0); 

    int[] intArray = new int[guidArray.Length/sizeof(int)]; 

    System.Buffer.BlockCopy(guidArray, 0, intArray, 0, guidArray.Length); 


    byte[] guidOutArray = new byte[guidArray.Length]; 

    System.Buffer.BlockCopy(intArray, 0, guidOutArray, 0, guidOutArray.Length); 

    System.Guid guidOut = new System.Guid(guidOutArray); 

    // check 
    System.Diagnostics.Debug.Assert(guidOut == guid); 
5

GUIDがちょうど16バイトであるとして、あなたは4つの整数に変換することができます:ちょうどバイト配列として整数を取得し、一緒に入れているバック変換

Guid id = Guid.NewGuid(); 

byte[] bytes = id.ToByteArray(); 
int[] ints = new int[4]; 
for (int i = 0; i < 4; i++) { 
    ints[i] = BitConverter.ToInt32(bytes, i * 4); 
} 

byte[] bytes = new byte[16]; 
for (int i = 0; i < 4; i++) { 
    Array.Copy(BitConverter.GetBytes(ints[i]), 0, bytes, i * 4, 4); 
} 
Guid id = new Guid(bytes); 
+0

なぜdownvote?あなたが間違っていると思われることを説明しなければ、答えを改善することはできません。 – Guffa

+0

これで結果は達成されますが、エンディアンに問題があるBitConverterを使用します –

+0

@ SuuryaPratap:なぜそれが問題だと思うかを明確にする必要があります。 – Guffa

関連する問題