发布网友
共1个回答
热心网友
通用的GUID的结构如下 typedefstruct_GUID{ DWORDData1; WORDData2; WORDData3; BYTEData4[8]; }GUID; 举一个例子: 假设一个GUID的格式是这样的6B29FC40-CA47-1067-B31D-00DD010662DA 其中Data1是32位,可以看做8个四位十六进制数,对应于上面的6B29FC40 其中Data2是16位,可以看做4个四位十六进制数,对应于上面的CA47 其中Data3是16位,可以看做4个四位十六进制数,对应于上面的1067 其中Data4比较特殊,是8个字节也就可以看做16个四位十六进制数 取其Data4[0],Data4[1]来组成4个四位十六进制数,对应于上面的B31D 取其Data4[2],Data4[3]来组成4个四位十六进制数,对应于上面的00DD 取其Data4[4],Data4[5]来组成4个四位十六进制数,对应于上面的0106 取其Data4[6],Data4[7]来组成4个四位十六进制数,对应于上面的62DA *注意:四位十六进制数对应一个GUID字符。 在Windows下提供了一个函数可以生成一个GUID。需要使用的头文件"objbase.h",需要链接的库ole32.lib。 HRESULTCoCreateGuid(GUID*pguid); 在Linux下首先需要下载到相应的库文件和头文件 如果是Debian用户可以方便的通过apt命令来获取相关资源。 apt-getinstalluuid-dev 安装完成后会发现 在/usr/include/下有一个uuid文件夹,其中则包含了uuid.h头文件。 在/usr/lib/下有几个libuuid*的链接库文件,包括静态和动态链接库。 打开uuid.h你会发现有一个uuid_generate(uuid_tout)的函数声明。我们可以通过调用这个函数来生成UUID。 uuid_generate(reinterpret_cast(&guid)); 生成GUID是不是很简单!是的,因为生成的算法不用我们去实现,我们是站在前人的肩膀所以我们要感谢他们。 下面给出一个WINDOWS和LINUX下通用的程序。 //uuid_test.cpp #include #include #include #include"uuid_test.hpp" #ifdefWIN32 #include #else #include #endif usingnamespacestd; namespaceChinuxTeam { GUIDCreateGuid() { GUIDguid; #ifdefWIN32 CoCreateGuid(&guid); #else uuid_generate(reinterpret_cast(&guid)); #endif returnguid; } std::stringGuidToString(constGUID&guid) { charbuf[]={0}; #ifdef__GNUC__ snprintf( #else//MSVC _snprintf_s( #endif buf, sizeof(buf), "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", guid.Data1,guid.Data2,guid.Data3, guid.Data4[0],guid.Data4[1], guid.Data4[2],guid.Data4[3], guid.Data4[4],guid.Data4[5], guid.Data4[6],guid.Data4[7]); returnstd::string(buf); } } 对应的头文件 //uuid_test.hpp" #include #include #include typedefstruct_GUID { unsignedlongData1; unsignedshortData2; unsignedshortData3; unsignedcharData4[8]; }GUID,UUID; namespaceChinuxTeam { GUIDCreateGuid(); std::stringGuidToString(constGUID&guid); }//namespaceChinuxTeam 最后一个GuidToString()稍微解释一下,作用就是把GUID以固定的格式输出到标准string字符串中, 根据编译器的不同调用分别调用了不同的字符串打印函数。 另外附一个简单的测试函数 #include #include #include #ifdefWIN32 #include"objbase.h" #else typedefstruct_GUID { unsignedlongData1; unsignedshortData2; unsignedshortData3; unsignedcharData4[8]; }GUID,UUID; #endif namespaceChinuxTeam{ GUIDCreateGuid(); std::stringGuidToString(constGUID&guid); } 运行后会生成一个GUID并打印到标准输出的控制台上。