转储GUID结构?

时间:2014-06-18 16:39:07

标签: c# php c

GUID结构显然看起来像this

typedef struct _GUID {
  DWORD Data1;
  WORD  Data2;
  WORD  Data3;
  BYTE  Data4[8];
} GUID;

如何查看这些DWORD / WORD / BYTE值是什么?我正试图吐出它们using C#,但我不知道如何打印它们。

我不在乎这是用C,C#还是其他任何语言完成的,我认为微软使用相同的结构。我只需要能够看到结构,所以我可以调试我需要阅读这些东西的PHP脚本。我现在无法访问Visual Studio(我在Ubuntu上)。


这“太宽泛”了吗?我将使其更具体:给定具有十六进制表示的{GUID E20A9380-FD55-BCA5-9037-451C9D86E949和二进制表示new byte[]{0x80,0x93,0x0a,0xe2,0x55,0xfd,0xa5,0xbc,0x90,0x37,0x45,0x1c,0x9d,0x86,0xe9,0x49}的GUID我想知道哪些字节对应于Data1Data2Data3及其数值是什么。

上面的超链接显示了我的尝试:

public static void Main()
{
    var guid = new Guid("E20A9380-FD55-BCA5-9037-451C9D86E949");
    Console.WriteLine(guid);
    PrintObj(guid);
}


public static void PrintObj(object obj)
{
    foreach(PropertyDescriptor descriptor in TypeDescriptor.GetProperties(obj))
    {
        string name=descriptor.Name;
        object value=descriptor.GetValue(obj);
        Console.WriteLine("{0}={1}",name,value);
    }
}

但它没有打印任何东西。那些不是我认为的可读属性。

2 个答案:

答案 0 :(得分:2)

如果你想在Ubuntu上使用C#,请查看Xamarin。

在C#中,Guid Structre公开ToByteArray您可以逐字节打印。

foreach(var b in id.ToBytearray()) Console.WriteLine("{0:X2}", b);

或者使用BitConverter类进行一些trnalsation以单独获取每个部分

var bytes = id.ToByteArray();
Console.WriteLine("Data1: {0:X8}", BitConverter.ToInt32(bytes, 0));
Console.WriteLine("Data2: {0:X4}", BitConverter.ToInt16(bytes, 4));
Console.WriteLine("Data3: {0:X4}", BitConverter.ToInt16(bytes, 6));
Console.WriteLine("Data4: {0:X16}", BitConverter.ToInt64(bytes, 8));

答案 1 :(得分:1)

这是我使用的一个类,它启用了一些基本的GUID操作。我相信它可以扩展到更多。

[编辑:在使用这个类之后,我注意到我的LittleEndian处理器对字节数组的解释很糟糕。我更新了公共方法以解释这一点,并包括修改高位字节的方法。]

public class GuidParts
{
    private byte[] _bytes;

    public GuidParts() : this(Guid.Empty)
    {
    }

    public GuidParts(Guid guid)
    {
        InitFromGuid(guid);
    }

    public GuidParts(string str)
    {
        var guid = Guid.Empty;
        if (Guid.TryParse(str, out guid))
        {
            InitFromGuid(guid);
        }
    }

    public Int32 Data1 { get; set; }
    public Int16 Data2 { get; set; }
    public Int16 Data3 { get; set; }

    public Int64 Data4
    {
        get { return BitConverter.ToInt64(_bytes, 0); }
        set { _bytes = BitConverter.GetBytes(value); } 

    }

    public byte[] Data4Bytes
    {
        get { return _bytes; }
        set { _bytes = SafeCopy(value, 8); }
    }

    public Int16 Data4High
    {
        get { return BitConverter.ToInt16(_bytes, 0); }
        set { Buffer.BlockCopy(BitConverter.GetBytes(value), 0, _bytes, 0, 2); }
    }

    public Int16 Data4HighReverse
    {
        get { return BitConverter.ToInt16(ReverseArray(_bytes), 0); }
        set { Buffer.BlockCopy(ReverseArray(BitConverter.GetBytes(value)), 0, _bytes, 0, 2); }
    }

    public Int64 Data4Reverse
    {
        get { return BitConverter.ToInt64(ReverseArray(_bytes), 0); }
        set { _bytes = ReverseArray(BitConverter.GetBytes(value)); }
    }

    public Guid ToGuid()
    {
        return new Guid(Data1, Data2, Data3, _bytes);
    }

    public override string ToString()
    {
        return ToGuid().ToString("B");
    }

    #region private

    private void InitFromGuid(Guid guid)
    {
        var b = guid.ToByteArray();
        Data1 = BitConverter.ToInt32(b, 0);
        Data2 = BitConverter.ToInt16(b, 4);
        Data3 = BitConverter.ToInt16(b, 6);
        _bytes = new[] { b[8], b[9], b[10], b[11], b[12], b[13], b[14], b[15] };
    }

    // Because Array.Reverse modifies the original array and returns void. Yuck.
    private T[] ReverseArray<T>(T[] input) where T : new()
    {
        int from = input.Length, to = 0;
        T[] reversed = new T[from];
        while (from-- > 0) reversed[to++] = input[from];
        return reversed;
    }

    private T[] SafeCopy<T>(T[] input, int count) where T : new()
    {
        T[] copied = new T[count];
        int position = 0, length = input.Length;
        while (position < length) copied[position] = input[position++];
        return copied;
    }

    #endregion
}