Получить байты из 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);

ваши проблемы проистекают из игнорирования кодировки в С#, а не кода С++