Получить байты из std :: string в C ++ - PullRequest
19 голосов
/ 03 февраля 2009

Я работаю в неуправляемом проекте C ++.

Мне нужно знать, как я могу взять строку типа «некоторые данные для шифрования» и получить массив byte [], который я собираюсь использовать в качестве источника для Encrypt.

В C # я делаю

  for (int i = 0; i < text.Length; i++)
    buffer[i] = (byte)text[i];

Мне нужно знать, как сделать то же самое, но с использованием неуправляемого C ++.

Спасибо!

Ответы [ 7 ]

27 голосов
/ 03 февраля 2009

Если вам нужен доступ только для чтения, то c_str() сделает это:

char const *c = myString.c_str();

Если вам нужен доступ для чтения / записи, вы можете скопировать строку в вектор. векторы управляют динамической памятью для вас. Тогда вам не нужно связываться с распределением / освобождением:

std::vector<char> bytes(myString.begin(), myString.end());
bytes.push_back('\0');
char *c = &bytes[0];
22 голосов
/ 03 февраля 2009

std::string::data может показаться достаточным и наиболее эффективным. Если вы хотите иметь неконстантную память для манипуляции (странно для шифрования), вы можете скопировать данные в буфер, используя memcpy :

unsigned char buffer[mystring.length()];
memcpy(buffer, mystring.data(), mystring.length());

Фанаты STL рекомендуют вам использовать std :: copy вместо:

std::copy(mystring.begin(), mystring.end(), buffer);

но в этом нет ничего особенного. Если вам нужно нулевое завершение, используйте std::string::c_str() и различные методы дублирования строк, которые были предоставлены другими, но я бы обычно этого избегал и просто запрашивал length. В частности, с помощью криптографии вы просто знаете, что кто-то попытается взломать его, добавив в него значения null, и использование std::string::data() отговаривает вас от ленивых предположений о базовых битах в строке.

3 голосов
/ 03 февраля 2009

Обычно функции шифрования принимают

encrypt(const void *ptr, size_t bufferSize);

в качестве аргументов. Вы можете передать c_str и длину напрямую:

encrypt(strng.c_str(), strng.length());

Таким образом, дополнительное пространство выделяется или теряется.

1 голос
/ 03 февраля 2009

Если вам просто нужно прочитать данные.

encrypt(str.data(),str.size());

Если вам нужна копия данных для чтения / записи, поместите ее в вектор. (Дон; т динамически выделять пространство, это работа вектора).

std::vector<byte>  source(str.begin(),str.end());
encrypt(&source[0],source.size());

Конечно, мы все предполагаем, что байт - это символ !!!

1 голос
/ 03 февраля 2009

Из std :: string вы можете использовать метод c_ptr (), если хотите получить указатель на буфер char_t.

Похоже, вы просто хотите скопировать символы строки в новый буфер. Я бы просто использовал функцию std :: string :: copy :

length = str.copy( buffer, str.size() );
0 голосов
/ 03 февраля 2009

Не думаю, что вы хотите использовать имеющийся у вас код c #. Они предоставляют System.Text.Encoding.ASCII (также UTF- *)

string str = "some text;
byte[] bytes = System.Text.Encoding.ASCII.GetBytes(str);

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

0 голосов
/ 03 февраля 2009

Если это просто ваниль С, то:

strcpy(buffer, text.c_str());

Предполагается, что буфер выделен и достаточно велик для содержания содержимого 'text', что является предположением в исходном коде.

Если encrypt () принимает 'const char *', тогда вы можете использовать

encrypt(text.c_str())

и вам не нужно копировать строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...