boost: uuid в char * без std :: string - PullRequest
       33

boost: uuid в char * без std :: string

0 голосов
/ 25 октября 2018

Я пытаюсь преобразовать повышающий 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] = '\0';
}

Использование:

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.

В чем проблема в моем коде?Насколько я знаю, мои манипуляции с символами имитируют то, что делает std :: string, за исключением временных копий из-за постоянного добавления.Или я ошибаюсь?

1 Ответ

0 голосов
/ 25 октября 2018

Ваш буфер 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++] = '-';
...