为什么Guid.ToString(“n”)与从同一guid的字节数组生成的hex字符串相同?

考虑以下unit testing:

[TestMethod] public void TestByteToString() { var guid = new Guid("61772f3ae5de5f4a8577eb1003c5c054"); var guidString = guid.ToString("n"); var byteString = ToHexString(guid.ToByteArray()); Assert.AreEqual(guidString, byteString); } private String ToHexString(Byte[] bytes) { var hex = new StringBuilder(bytes.Length * 2); foreach(var b in bytes) { hex.AppendFormat("{0:x2}", b); } return hex.ToString(); } 

这是结果:

Assert.AreEqual failed. Expected:. Actual:.

嗯,它们是相同的,在前4个字节之后。 前四个是相同的,只是顺序相反。

基本上,当从字符串创建时,它被假定为“big-endian”格式:左边的最高字节。 但是,当在内部存储(在Intel-ish机器上)时,字节按“little-endian”排序:右边的最高位字节。

如果比较结果,您可以看到前三组是相反的:

 61 77 2f 3a e5 de 5f 4a 8577eb1003c5c054
 3a 2f 77 61 de e5 4a 5f 8577eb1003c5c054

那是因为在GUID结构中 ,这3个组被定义为DWORD和两个WORD而不是字节:

 {0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} 

所以在内存中,英特尔处理器以Little-endian顺序存储它们(最后一个最重要的字节)。

GUID的结构如下:

 int a short b short c byte[8] d 

因此,对于由代码表示的部分,可以反转字节。 所有其他部分都正确转换。