2009-02-02 3 views
15

Я работаю над неуправляемым проектом C++.Получить байт из std :: string в C++

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

В C# я

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

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

Спасибо!

+0

, очевидно, речь идет о C++. я исправил опечатки –

+0

Да, вы правы, спасибо – Vic

ответ

24

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

char const *c = myString.c_str(); 

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

std::vector<char> bytes(myString.begin(), myString.end()); 
bytes.push_back('\0'); 
char *c = &bytes[0]; 
+1

Если ему нужен массив байтов, ему нужен завершающий '\ 0'? В этом случае вы можете использовать data() только для чтения. –

+0

Я не был уверен, нужен ли ему \ 0 или нет. Если он этого не знает, он теперь знает, что может использовать .data(). спасибо, что прокомментировал это, Мартин. –

+1

Этот ответ кажется правильным и может работать, но при условии, что хранилище данных для вектора char смежно и не изменится, опасно. – Mark

1

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

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

length = str.copy(buffer, str.size()); 
+0

Некоторые реализации std :: string могут использовать подсчет ссылок, поэтому копия не обязательно приведет к новым байтам, которые можно было бы безопасно записывать. –

0

Если это просто ванильным C, а затем:

strcpy(buffer, text.c_str()); 

Предполагая, что буфер выделяется и достаточно большой, чтобы вместить содержимое «текст», который это предположение в вашем исходном коде.

Если шифровать() принимает «константный символ *», то вы можете использовать

encrypt(text.c_str()) 

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

3

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

encrypt(const void *ptr, size_t bufferSize); 

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

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

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

+0

Если вы передаете указатель и длину, вы должны использовать data(), а не c_str(), чтобы указать, что он не используется в качестве строки. –

18

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.В частности, с криптографией вы просто знаете, что кто-то попытается сломать ее, вставив в нее нули, и использование std::string::data() не позволяет вам лениво делать предположения о базовых битах в строке.

1

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

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

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

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

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

-6

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

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

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

Смежные вопросы