Получить байты из std::string в С++
Я работаю над неуправляемым проектом на С++.
Мне нужно знать, как я могу взять строку типа "некоторые данные для шифрования" и получить массив byte [], который я буду использовать в качестве источника для Encrypt.
В С# я делаю
for (int i = 0; i < text.Length; i++)
buffer[i] = (byte)text[i];
Мне нужно знать, как сделать то же самое, но использовать неуправляемый С++.
Спасибо!
Ответы
Ответ 1
Если вам просто нужен доступ только для чтения, тогда c_str()
сделает это:
char const *c = myString.c_str();
Если вам нужен доступ для чтения/записи, вы можете скопировать строку в вектор. векторы управляют динамической памятью для вас. Вам не нужно связываться с распределением/освобождением, а затем:
std::vector<char> bytes(myString.begin(), myString.end());
bytes.push_back('\0');
char *c = &bytes[0];
Ответ 2
std::string::data
будет казаться достаточным и наиболее эффективным. Если вы хотите, чтобы некорректная память работала (странно для шифрования), вы можете скопировать данные в буфер с помощью memcpy:
unsigned char buffer[mystring.length()];
memcpy(buffer, mystring.data(), mystring.length());
STL fanboys будет поощрять вас вместо std:: copy:
std::copy(mystring.begin(), mystring.end(), buffer);
но на самом деле это не так много. Если вам нужна нулевая остановка, используйте std::string::c_str()
и различные методы дублирования строк, которые другие предоставили, но я бы вообще избегал этого и просто запрашивал length
. В частности, с криптографией вы просто знаете, что кто-то попытается сломать ее, вставив в нее нули, а использование std::string::data()
не позволяет вам лениво делать предположения о базовых битах в строке.
Ответ 3
Обычно функции шифрования принимают
encrypt(const void *ptr, size_t bufferSize);
в качестве аргументов. Вы можете напрямую передавать c_str и длину:
encrypt(strng.c_str(), strng.length());
Таким образом, дополнительное пространство выделяется или теряется.
Ответ 4
Если вам просто нужно прочитать данные.
encrypt(str.data(),str.size());
Если вам нужна копия данных для чтения/записи, поместите ее в вектор. (Don; t динамически выделяет пространство, которое задает вектор).
std::vector<byte> source(str.begin(),str.end());
encrypt(&source[0],source.size());
Конечно, мы все предполагаем, что байт является char!!!
Ответ 5
Из std::string вы можете использовать метод c_ptr(), если хотите получить указатель на буфер char_t.
Похоже, вы просто хотите скопировать символы строки в новый буфер. Я просто использовал функцию std::string:: copy:
length = str.copy( buffer, str.size() );
Ответ 6
Если это просто ваниль C, то:
strcpy(buffer, text.c_str());
Предполагая, что буфер выделен и достаточно велик для хранения содержимого "текста", что является предположением в вашем исходном коде.
Если encrypt() принимает 'const char *', вы можете использовать
encrypt(text.c_str())
и вам не нужно копировать строку.
Ответ 7
Я не думаю, что вы хотите использовать код С#, который у вас там есть. Они предоставляют System.Text.Encoding.ASCII(также UTF- *)
string str = "some text;
byte[] bytes = System.Text.Encoding.ASCII.GetBytes(str);
ваши проблемы проистекают из игнорирования кодировки в С#, а не кода С++