boost:uuid 变成 char * 没有 std::string
boost:uuid into char * without std::string
我正在尝试将提升 UUID 转换为 char *
,而根本不必使用 std::string
。
我主要将 to_string
方法从 https://www.boost.org/doc/libs/1_68_0/boost/uuid/uuid_io.hpp 修改为我自己的版本。但是,它在某些 UUID 上失败。
这是我的修改:
#include <boost/uuid/string_generator.hpp>
#include <boost/uuid/uuid_generators.hpp>
using UUID = boost::uuids::uuid;
static constexpr std::size_t UUID_STR_LEN = 37;
inline char uuid_byte_to_char(size_t i)
{
if (i <= 9) {
return static_cast<char>('0' + i);
} else {
return static_cast<char>('a' + (i - 10));
}
}
inline void uuid_to_cstr(UUID const& uuid, char out[UUID_STR_LEN])
{
std::size_t out_i = 0;
std::size_t dash_i = 0;
for (UUID::const_iterator it_data = uuid.begin(); it_data != uuid.end(); ++it_data, ++dash_i) {
const size_t hi = ((*it_data) >> 4) & 0x0F;
out[out_i++] = uuid_byte_to_char(hi);
const size_t lo = (*it_data) & 0x0F;
out[out_i++] = uuid_byte_to_char(lo);
if (dash_i == 3 || dash_i == 5 || dash_i == 7 || dash_i == 9) {
out[out_i++] += '-';
}
}
out[UUID_STR_LEN - 1] = '[=12=]';
}
用法:
int main() {
UUID uuid(uuid_generator());
char uuid_cstr(UUID_STR_LEN];
uuid_to_str(uuid uuid_cstr);
std::cout << uuid_cstr << "\n";
}
因此,例如,如果 UUID 是 cd0fa728-e7d6-4578-9450-7beb284e0103
,则可以正常工作。
然而,对于 0cf31c43-7621-407c-94d6-6d593bae96e8
,我最终得到的是 0cf31c43-7621�407cQ94d6-6d593bae96e8
。
我的代码有什么问题?据我所知,我的 char 操作模仿了 std::string 所做的减去由于不断追加而产生的临时副本。还是我弄错了?
你的缓冲区 char uuid_cstr[UUID_STR_LEN];
被分配到堆栈上,所以它有垃圾值,缓冲区中的所有元素都有一些初始值可能不是 0。
1) 您可以通过
将所有项目设置为零
char uuid_cstr[UUID_STR_LEN];
memset (uuid_cstr,0,UUID_STR_LEN);
那么下面的语句就可以了
out[out_i++] += '-';
2) 或者使用赋值
out[out_i++] = '-';
我正在尝试将提升 UUID 转换为 char *
,而根本不必使用 std::string
。
我主要将 to_string
方法从 https://www.boost.org/doc/libs/1_68_0/boost/uuid/uuid_io.hpp 修改为我自己的版本。但是,它在某些 UUID 上失败。
这是我的修改:
#include <boost/uuid/string_generator.hpp>
#include <boost/uuid/uuid_generators.hpp>
using UUID = boost::uuids::uuid;
static constexpr std::size_t UUID_STR_LEN = 37;
inline char uuid_byte_to_char(size_t i)
{
if (i <= 9) {
return static_cast<char>('0' + i);
} else {
return static_cast<char>('a' + (i - 10));
}
}
inline void uuid_to_cstr(UUID const& uuid, char out[UUID_STR_LEN])
{
std::size_t out_i = 0;
std::size_t dash_i = 0;
for (UUID::const_iterator it_data = uuid.begin(); it_data != uuid.end(); ++it_data, ++dash_i) {
const size_t hi = ((*it_data) >> 4) & 0x0F;
out[out_i++] = uuid_byte_to_char(hi);
const size_t lo = (*it_data) & 0x0F;
out[out_i++] = uuid_byte_to_char(lo);
if (dash_i == 3 || dash_i == 5 || dash_i == 7 || dash_i == 9) {
out[out_i++] += '-';
}
}
out[UUID_STR_LEN - 1] = '[=12=]';
}
用法:
int main() {
UUID uuid(uuid_generator());
char uuid_cstr(UUID_STR_LEN];
uuid_to_str(uuid uuid_cstr);
std::cout << uuid_cstr << "\n";
}
因此,例如,如果 UUID 是 cd0fa728-e7d6-4578-9450-7beb284e0103
,则可以正常工作。
然而,对于 0cf31c43-7621-407c-94d6-6d593bae96e8
,我最终得到的是 0cf31c43-7621�407cQ94d6-6d593bae96e8
。
我的代码有什么问题?据我所知,我的 char 操作模仿了 std::string 所做的减去由于不断追加而产生的临时副本。还是我弄错了?
你的缓冲区 char uuid_cstr[UUID_STR_LEN];
被分配到堆栈上,所以它有垃圾值,缓冲区中的所有元素都有一些初始值可能不是 0。
1) 您可以通过
将所有项目设置为零char uuid_cstr[UUID_STR_LEN];
memset (uuid_cstr,0,UUID_STR_LEN);
那么下面的语句就可以了
out[out_i++] += '-';
2) 或者使用赋值
out[out_i++] = '-';