如何将保存在字节数组中的UUID转换为字符串(c++)



我有一个UUID,它保存为16字节的数据,如下所示:

   unsigned char uuid[16]; //128-bits unique identifier

我想把它转换成std::字符串。我可能可以写一个循环来思考所有字节并生成字符串,但我正在寻找一个更简单/更快的解决方案。有这样的解决方案吗?

如果你真的想避免循环,你可以做一些事情,比如:

char str[37] = {};
sprintf(str, 
"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", 
    uuid[0], uuid[1], uuid[2], uuid[3], uuid[4], uuid[5], uuid[6], uuid[7],
    uuid[8], uuid[9], uuid[10], uuid[11], uuid[12], uuid[13], uuid[14], uuid[15]
);

不是很优雅,但我认为这是最好的,没有循环,没有平台依赖。

这个问题的答案无论如何都是错误的。

根据https://en.wikipedia.org/wiki/Universally_unique_identifier#Format

这是正确的代码:

char str[37] = {};
unsigned long data1 = *reinterpret_cast<unsigned long*>(uuid);
unsigned short data2 = *reinterpret_cast<unsigned short*>(uuid + 4);
unsigned short data3 = *reinterpret_cast<unsigned short*>(uuid + 6);
sprintf(str, 
"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", 
    data1, data2, data3,
    uuid[8], uuid[9], uuid[10], uuid[11], uuid[12], uuid[13], uuid[14], uuid[15]
);

编写一个循环。对于每个字节,snprintf为%#02x。不要忘记传统的破折号。

没有依赖于平台(即POSIX)的API来格式化UUID,所以这是最好的。

basic_string提供此构造函数:

basic_string(const E *s, size_type n, const A& al = A());

所以你可以这样做:

string strUuid(uuid, 16);

相关内容

  • 没有找到相关文章

最新更新