当在C#immediate窗口中输入以下代码时,会产生一些异常结果,我只能假设是因为在内部,System.Guid
翻转了某些字节:
使用0到15之间的序数字节数组
new Guid(new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15})
[03020100-0504-0706-0809-0a0b0c0d0e0f]
使用值为0到15
的非序数字节数组时new Guid(new byte[] {3, 2, 1, 0, 5, 4, 7, 6, 8, 9, 10, 11, 12, 13, 14, 15})
[00010203-0405-0607-0809-0a0b0c0d0e0f]
为什么前3组被翻转?
答案 0 :(得分:2)
在Wikipedia上找到有关UUID的内容。
其他系统,特别是Microsoft在其COM / OLE库中对UUID进行编组,使用混合端格式,其中UUID的前三个组件是little-endian,后两个是big-endian
例如,00112233-4455-6677-8899-aabbccddeeff编码为字节33 22 11 00 55 44 77 66 88 99 aa bb cc dd ef ff
答案 1 :(得分:1)
第一个4字节块属于Int32值,接下来的两个块属于由于byte order而反向分配给Guid的Int16值。也许您应该尝试将具有匹配整数数据类型的other constructor作为参数,并提供更直观的排序:
Guid g = new Guid(0xA, 0xB, 0xC,
new Byte[] { 0, 1, 2, 3, 4, 5, 6, 7 } );
Console.WriteLine("{0:B}", g);
// The example displays the following output:
// {0000000a-000b-000c-0001-020304050607}
答案 2 :(得分:1)
查看source code of Guid.cs
以查看其背后的结构:
ApacheJMeter.jar
如您所见,内部Guid由32位整数,两个16位整数和8个单独字节组成。在little-endian architectures上,后面的第一个// Represents a Globally Unique Identifier.
public struct Guid : IFormattable, IComparable,
IComparable<Guid>, IEquatable<Guid> {
// Member variables
private int _a; // <<== First group, 4 bytes
private short _b; // <<== Second group, 2 bytes
private short _c; // <<== Third group, 2 bytes
private byte _d;
private byte _e;
private byte _f;
private byte _g;
private byte _h;
private byte _i;
private byte _j;
private byte _k;
...
}
和两个int
的字节以相反的顺序存储。其余八个字节的顺序保持不变。