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