2014-01-29 122 views

回答

2

C'ish溶液:

/* 128 bit GUID to human-readable string */ 
char * guid_to_str(const GUID * id, char * out) { 
    int i; 
    char * ret = out; 
    out += sprintf(out, "%.8lX-%.4hX-%.4hX-", id->Data1, id->Data2, id->Data3); 
    for (i = 0; i < sizeof(id->Data4); ++i) { 
     out += sprintf(out, "%.2hhX", id->Data4[i]); 
     if (i == 1) *(out++) = '-'; 
    } 
    return ret; 
} 

這假定輸出緩衝器已經被分配,並且應當是尺寸爲37個字節(包括空終止字符)的。

輸出的形式爲"75B22630-668E-11CF-A6D9-00AA0062CE6C"

用例:

GUID g; 
char buffer[37]; 

std::cout << guid_to_str(&g, buffer); 

注:

存在此代碼,因爲我不得不實施GUID Linux下的解析,否則我會使用@krowe提到的Windows API函數StringFromCLSID

+0

請給我一個如何使用這個例子的例子。謝謝 – David

+0

謝謝大家,我可以給你的是+1和打勾 – David

2

Windows API具有這樣的功能:

CLSID clsid; 
HRESULT hr = CLSIDFromProgID ((OLESTR "Adobe.SVGCtl.3"),&clsid); 

// Get class id as string 
LPOLESTR className; 
hr = StringFromCLSID(clsid, &className); 

// convert to CString 
CString c = (char *) (_bstr_t) className; 

// then release the memory used by the class name 
CoTaskMemFree(className); 

// Now c is ready to use 
+0

你可以舉個例子嗎? – David

+0

希望清除它 – krowe

2

Here是一個很好的例子,用於將GUID轉換爲字符串,反之亦然,我在我的項目中使用:

std::string guidToString(GUID guid) { 
    std::array<char,40> output; 
    snprintf(output.data(), output.size(), "{%08X-%04hX-%04hX-%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]); 
    return std::string(output.data()); 
} 

GUID stringToGUID(const std::string& guid) { 
    GUID output; 
    const auto ret = sscanf(guid.c_str(), "{%8X-%4hX-%4hX-%2hX%2hX-%2hX%2hX%2hX%2hX%2hX%2hX}", &output.Data1, &output.Data2, &output.Data3, &output.Data4[0], &output.Data4[1], &output.Data4[2], &output.Data4[3], &output.Data4[4], &output.Data4[5], &output.Data4[6], &output.Data4[7]); 
    if (ret != 11) 
     throw std::logic_error("Unvalid GUID, format should be {00000000-0000-0000-0000-000000000000}"); 
    return output; 
} 

在該示例中,首先在轉換爲字符串之前使用char *,因此這正是您以有效方式查找的內容。