u = reinterpret_cast<boost::uuids::uuid*>(g);
我相信你应该在reinterpret_cast中取g的地址:
u = reinterpret_cast<boost::uuids::uuid*>(&g);
即使你拿了地址,我认为你还有其他麻烦。 Microsoft 在其GUID 结构中使用双字和单词,而 Boost 使用字节。
Microsoft:
typedef struct _GUID {
DWORD Data1; WORD Data2; WORD Data3; BYTE Data4[8];
} GUID;
Boost:
struct uuid
{
...
public:
// or should it be array<uint8_t, 16>
uint8_t data[16];
};
我认为您需要执行显式转换,例如:
void MsToBoostUuid(const GUID& ms, boost::uuids::uuid& bst)
{
bst.data[0] = static_cast<uint8_t>(ms.Data1 >> 24);
bst.data[1] = static_cast<uint8_t>(ms.Data1 >> 16);
bst.data[2] = static_cast<uint8_t>(ms.Data1 >> 8);
bst.data[3] = static_cast<uint8_t>(ms.Data1 >> 0);
bst.data[4] = static_cast<uint8_t>(ms.Data2 >> 8);
bst.data[5] = static_cast<uint8_t>(ms.Data2 >> 0);
bst.data[6] = static_cast<uint8_t>(ms.Data3 >> 8);
bst.data[7] = static_cast<uint8_t>(ms.Data3 >> 0);
bst.data[8] = ms.Data4[0];
bst.data[9] = ms.Data4[1];
...
bst.data[14] = ms.Data4[6];
bst.data[15] = ms.Data4[7];
}
void foo(const GUID& g)
{
boost::uuids::uuid u;
MsToBoostUuid(g, u);
std::string ustr = boost::lexical_cast<std::string>(*u);
}
您还可以添加运算符,例如:
inline bool operator==(const& uuid lhs, const GUID& rhs)
{
boost::uuids::uuid t;
MsToBoostUuid(rhs, t);
return std::equal(lhs.begin(), lhs.end(), t.begin());
}
inline bool operator==(const GUID& lhs, const& uuid rhs)
{
boost::uuids::uuid t;
MsToBoostUuid(lhs, t);
return std::equal(t.begin(), t.end(), rhs.begin());
}
...结果与这篇帖子Boost uuid + boost endian 所说的完全相同,字节顺序错误。
我认为当前接受的答案不正确。我相信 Dutton 的回答是正确的,但它并没有向您展示 UUID 类型之间的典型转换。