我有一个UUID,保存为一个16字节的数据,像这样。
unsigned char uuid[16]; //128-bits unique identifier
我想把它转换成一个std: :string. 我也许可以写一个循环来思考所有字节并生成字符串,但我正在寻找一个更简单、更快速的解决方案。有没有这样的解决方案?
如果你真的想避免循环,你总是可以做这样的事情。
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]
);
不是很优雅,但我认为这是最好的,你可以得到没有循环和没有平台依赖性。
写一个循环。对于每一个字节,snprintf为%#02x。不要忘记传统的破折号。
没有独立于平台的(即POSIX)API来格式化UUIDs,所以这是你能得到的最好的。
这个问题的答案是错误的。
根据 https:/en.wikipedia.orgwikiUniversally_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]
);
basic_string提供了这个构造函数
basic_string(const E *s, size_type n, const A& al = A());
所以你可以这样做。
string strUuid(uuid, 16);