C# 为什么不是';t Guid.ToString(“n”)是否与从相同Guid的字节数组生成的十六进制字符串相同?

C# 为什么不是';t Guid.ToString(“n”)是否与从相同Guid的字节数组生成的十六进制字符串相同?,c#,guid,hex,C#,Guid,Hex,考虑以下单元测试: [TestMethod] public void TestByteToString() { var guid = new Guid("61772f3ae5de5f4a8577eb1003c5c054"); var guidString = guid.ToString("n"); var byteString = ToHexString(guid.ToByteArray()); Asser

考虑以下单元测试:

    [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失败。预期:。实际值:。

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


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

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

61 77 2f 3a e5 de 5f 4a 8577eb1003c5c054 3a 2f 77 61 de e5 4a 5f 8577eb1003c5c054
因此,在内存中,英特尔处理器以小尾端顺序(最高有效字节最后一个)存储它们。

GUID的结构如下:

int a
short b
short c
byte[8] d

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

为什么
b
c
也不能反转?@SebastianGodelet-因为它们是
short
而不是
int
。我认为大于一个字节的所有内容都有尾数:
short s=0xaf21可以被存储:| af | 21 |或| 21 | af |@SebastianGodelet-可能,但是endianness通常在
int
级别。我不想让人讨厌,但我认为这里有一点误解。。。16位整数,c.f.
System.Int16
也受尾数的影响,例如:Unicode传输编码:UTF-16LE和UTF-16BE,但仅限于:UTF-8,
int a
short b
short c
byte[8] d