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;
}
Run Code Online (Sandbox Code Playgroud)
这假设输出缓冲区已经分配,并且大小应该为 37 个字节(包括空终止字符)。
输出的形式 "75B22630-668E-11CF-A6D9-00AA0062CE6C"
用法示例:
GUID g;
char buffer[37];
std::cout << guid_to_str(&g, buffer);
Run Code Online (Sandbox Code Playgroud)
笔记:
这段代码存在是因为我必须在Linux下实现GUID解析,否则我会使用StringFromCLSID@krowe提到的Windows API函数。
这是我在项目中使用的将 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;
}
Run Code Online (Sandbox Code Playgroud)
在示例中,它在转换为字符串之前首先使用char*,因此这正是您以有效方式寻找的内容。
| 归档时间: |
|
| 查看次数: |
11724 次 |
| 最近记录: |