Неожиданное поведение ПОСЛЕ использования reinterpret_cast c ++ - PullRequest
0 голосов
/ 18 октября 2019

У меня возникла проблема с кодом при попытке преобразовать string в uint8_t*. Обратите внимание, что я новичок в C ++, я стараюсь изо всех сил, чтобы понять это.

Мой метод получает строку:

8D7152D03D05942E403EB59DC2923B3F, E5DE428B05C0CE081E20E870712D7BE8,127

Который затем разделяется на разделитель ','. Затем я вызываю функцию для преобразования string s в uint8_t*.

Каким-то образом моя переменная key_ получает правильное значение, но впоследствии значение изменяется.

struct Key{
    uint8_t *key_;
    uint8_t *iv_;
    uint32_t creation_timestamp;

    ...

    void from_String(string text){

        printf("Text to convert = %s\n", text.c_str());
        stringstream ss(text);
        string item;
        vector<string> splittedStrings;

        while(getline(ss,item,',')){
            splittedStrings.push_back(item);
        }

        if(splittedStrings.size() == 3){
            convert(splittedStrings[0],0);
            printf("Key: %s\n", key_);
            convert(splittedStrings[1],1);
            convert(splittedStrings[2],2);
        }else{
            printf("Error ! Trying to reconstruct message with invalid data!\n");
        }
    }

    ...

    void convert(string toConvert, int i){

        char* endptr = NULL;

        if (i == 0){
            key_ = (uint8_t*) reinterpret_cast<const uint8_t*>(&toConvert[0]);
        }else if (i == 1){
            printf("Key2: %s\n", key_);
            iv_ = (uint8_t*) reinterpret_cast<const uint8_t*>(&toConvert[0]);
        }else if (i == 2){
            creation_timestamp = strtol(toConvert.c_str(), &endptr, 10);
            handleErrors(endptr, toConvert, creation_timestamp);
        }else {
            printf("Error. Operator is not correct!\n");
        }
    }
};

Посмотрите, как printf s показывают значение key_. Выход программы:

Текст обращенного = 8D7152D03D05942E403EB59DC2923B3F, E5DE428B05C0CE081E20E870712D7BE4,40653

1026 * Key: 8D7152D03D05942E403EB59DC2923B3F
1028 * Key2: E5DE428B05C0CE081E20E870712D7BE4
1030

Это из-за неожиданного поведения reinterpret_cast? Я уже пробовал некоторые другие способы преобразования string в uint8_t*, но результат был тот же. Я пытался использовать switch вместо if else условий, но результат был таким же.

...