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我想知道哪些字节对应于Data1
,Data2
和Data3
及其数值是什么。
上面的超链接显示了我的尝试:
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);
}
}
但它没有打印任何东西。那些不是我认为的可读属性。
答案 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
}