我有一个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);