Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 15.12.2020
Сообщений: 3
1

Как правильно преобразовать строку std::string (массив байт) в std::char*

01.02.2021, 12:13. Показов 841. Ответов 1

Author24 — интернет-сервис помощи студентам
Я использую библиотеку CryptoPP для AES и RSA шифрования. И у меня возникает проблема при преобразовании std::string в const std::char*. На сколько я понимаю (по скриншотам ниже), проблема заключается в том, что функция .c_str() обрезает строку в месте где встречается \0.

Это функция шифрования:
C++
1
2
3
4
5
string RSACryptography::Encrypt(string text) {
    string cipher_text;
    CryptoPP::StringSource(text, true, new CryptoPP::PK_EncryptorFilter(this->rng, this->publicKey, new CryptoPP::StringSink(cipher_text)));
    return cipher_text;
}
Это функция дешифрования:
C++
1
2
3
4
5
string RSACryptography::Decipher(string text) {
    string decipher_text;
    CryptoPP::StringSource(text, true, new CryptoPP::PK_DecryptorFilter(this->rng, this->privateKey, new CryptoPP::StringSink(decipher_text)));
    return decipher_text;
}
Вот код который я вызываю:
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main() {
    RSACryptography* RSACrypt = new RSACryptography();
    string cipher_text = RSACrypt->Encrypt("hellO");
 
    const char* cipher_text_test = const_cast<char*>(cipher_text.c_str());
    
    cout << "cipher text (string):\n" << cipher_text << "\n\n\n\n"
        << "cipher test (string.c_str()):\n" << cipher_text_test << "\n\n\n\n";
 
    system("pause");
    return 0;
}
(.data() я уже пробовал)

https://github.com/Shue-moe/he... /O4ME6.png

Я задавал этот вопрос на StackOverflow, там мне объяснили что .c_str() не обрезает строку, и я понимаю что это так, однако, когда я вывел зашифрованную строку, а после приравнял к другой строке значение <зашифрованная строка>.c_str() я получаю обрезанную строку. И я говорю об этом с уверенность не потому что когда вывожу она меньше изначальной, нет. Потому что когда я сравниваю размер исходной и той что мне отдала .c_str(), (функцией .length()) их размер часто разный. Опять таки, от везений, встретится ли \0 или нет.

C++
1
2
3
4
5
6
7
8
9
10
11
12
int main() {
    RSACryptography* RSACrypt = new RSACryptography();
    string cipher_text = RSACrypt->Encrypt("hellO");
    
    cout << "cipher text (string):\n" << cipher_text;
 
    string cipher_text_test = cipher_text.c_str();
    
    cout << "\n\n\n==========\n\n\n" << cipher_text_test << "\n==========\n\n\n";
    system("pause");
        
}
И я понимаю что проблема именно в символе '\0', потому как если в строке не встречается этот символ, то преобразование из std::string в const std::char* проходит нормально. То есть вероятность того, что код сработает нормально, 1 к 9 (это типа примерно).

И вот у меня назревает вопрос, как мне перевести строку в const std::char*, что бы при этом она не останавливалась на символе \0?

Я могу использовать кастыль: шифровать строку, и после проверять, есть ли в ней символ \0 в середине строки. Если есть, шифровать ещё раз, и проверять. И только при нормальном исходе отдавать в Python. Но так кастылять я не хочу.

Прошу подскажите кто знает

P.S. Я сравнивал длину строки cipher_text и cipher_text_test -- у них часто разный размер

P.S.S. Мне это нужно для того что бы я мог передать в Python зашифрованную строку (то есть возможны только 2 типа хранения: std::char* и std::wchar_t*).

P.S.S.S. Когда я передаю зашифрованную строку в функцию дешифрования, всё работает отлично. Если я преобразовываю строку в строку, со значением которое отдаёт функция .c_str(), то вероятность того, что функция дешифрования не уйдёт в ошибку, 1 к 9. (всм если изначальная шифрованная строка не имела \0, то преобразование пройдёт отлично и функция дешифрует строку).
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.02.2021, 12:13
Ответы с готовыми решениями:

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка...

Как правильно сделать std::string блоками по 16 байт?
Я новенькая, простите за плохое оформление. Есть строка std::string которую нужно поместить в блок...

ошибка в программе (cannot convert 'std::string {aka std::basic_string<char>}' to 'const char*')
int main() { string fileName, currWord, currMax = &quot;&quot;; cin&gt;&gt;fileName; ...

Как правильно перевести std::wstring в std::string ?
Собственно как? :)

1
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
01.02.2021, 12:51 2
Цитата Сообщение от uname --all Посмотреть сообщение
Я использую библиотеку CryptoPP для AES и RSA шифрования. И у меня возникает проблема при преобразовании std::string в const std::char*. На сколько я понимаю (по скриншотам ниже), проблема заключается в том, что функция .c_str() обрезает строку в месте где встречается \0.
Нет, не обрезает. Просто std::cout выводит до нуля. Проверь cipher_text.size()

Добавлено через 3 минуты
Цитата Сообщение от uname --all Посмотреть сообщение
И вот у меня назревает вопрос, как мне перевести строку в const std::char*, что бы при этом она не останавливалась на символе \0?
А там разве должны быть нули в середине?

Добавлено через 8 минут
Может тебе там ещё нужно CryptoPP::HexEncoder/CryptoPP::HexDecoder использовать?
0
01.02.2021, 12:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.02.2021, 12:51
Помогаю со студенческими работами здесь

std::getline Альтернатива для (std::string, int, char)
Есть у кого идеи? Есть строка чисел(разделены пробелами), хочу считывать числа до пробела в инт...

(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&
astxx::manager::connection::connection(std::basic_string&lt;char, std::char_traits&lt;char&gt;,...

Странная ошибка: [Error] no match for call to '(std::string {aka std::basic_string<char>}) (int&)'
У меня появляется проблема при компиляции сей программы: #include &lt;iostream&gt; #include &lt;string&gt;...

Преобразовать const unsigned char* в std::string (или _bstr_t )
Здравствуйте старшие товарищи! Есть функция, которая возвращает результат типа const unsigned...

Error C2664: std::vector<_Ty>::push: невозможно преобразовать параметр 1 из 'double' в 'const std::string &'
#include &lt;iostream&gt; #include &lt;stack&gt; #include &lt;sstream&gt; #include &lt;string&gt; using namespace...

Где и почему используют ту или иную строку std::string, char[], System::String^ ?
Где и почему используют ту или иную строку std::string, char, System::String^ ? Объясните...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru