2009-02-02 12 views
15

Pracuję w niezarządzanym projekcie C++.Pobierz bajty ze std :: string w C++

Potrzebuję wiedzieć, w jaki sposób mogę wziąć ciąg znaków, taki jak ten "niektóre dane do zaszyfrowania" i uzyskać tablicę bajtów [], której użyję jako źródła do zaszyfrowania.

W języku C# zrobić

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

Co muszę wiedzieć, jak to zrobić to samo, ale używając niezarządzanego C++.

Dzięki!

+0

oczywiście jest o C++. Naprawiłem literówki –

+0

tak, masz rację, dziękuję – Vic

Odpowiedz

24

Jeśli wystarczy dostęp tylko do odczytu, a następnie c_str() zrobi:

char const *c = myString.c_str(); 

Jeśli potrzebujesz do odczytu/zapisu, a następnie można skopiować ciąg w wektorze. wektory zarządzają pamięcią dynamiczną. Nie trzeba zadzierać z alokacji/dealokacji następnie:

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

Jeśli chce tablicy bajtów, musi on zakończyć "\ 0"? W takim przypadku możesz użyć danych() tylko do odczytu. –

+0

Nie byłem pewien, czy potrzebuje \ 0, czy nie. Jeśli tego nie wie, teraz wie, że może użyć .data(). dzięki za komentarz, Martin. –

+1

Ta odpowiedź wydaje się być poprawna i może działać, ale zakładając, że magazyn danych dla wektora znaku jest ciągły i nie zmieni się, jest niebezpieczny. – Mark

1

od A std :: string można wykorzystać metodę c_ptr(), jeśli chcesz dostać się do wskaźnika bufora char_t.

Wygląda na to, że chcesz skopiować znaki ciągu do nowego bufora. Chciałbym po prostu użyć std::string::copy funkcję:

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

Niektóre implementacje std :: string mogą wykorzystywać liczenie odwołań, więc kopia niekoniecznie spowoduje powstanie nowych bajtów, które można bezpiecznie zapisać. –

0

Jeśli jest to tylko zwykły waniliowy C, a następnie:

strcpy(buffer, text.c_str()); 

Zakładając, że bufor jest przydzielone i wystarczająco duże, aby pomieścić zawartość „tekst”, który jest założeniem w twoim oryginalnym kodzie.

Jeśli szyfrowanie() pobiera „const char *” można użyć

encrypt(text.c_str()) 

i nie trzeba skopiować ciąg.

3

Normalnie, funkcje szyfrowania wziąć

encrypt(const void *ptr, size_t bufferSize); 

jako argumenty. Możesz przekazać c_str i długość bezpośrednio:

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

W ten sposób dodatkowa przestrzeń zostaje przydzielona lub zmarnowana.

+0

Jeśli podajesz wskaźnik i długość, powinieneś używać parametru data() zamiast c_str(), aby wskazać, że nie jest on używany jako ciąg. –

18

std::string::data wydaje się być wystarczająca i najbardziej wydajna. Jeśli chcesz mieć non-const pamięci do manipulowania (dziwne dla szyfrowania) można skopiować dane do bufora używając memcpy:

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

STL fanboys będzie zachęcać do korzystania std::copy zamiast:

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

, ale naprawdę nie ma w tym wiele odwagi. Jeśli potrzebujesz zerowania, użyj std::string::c_str() i różnych technik duplikowania ciągów, które dostarczyły inne, ale generalnie powinienem tego uniknąć i po prostu zapytać o numer length.Szczególnie w przypadku kryptografii po prostu wiesz, że ktoś spróbuje ją złamać poprzez wrzucenie do niej wartości zerowych, a użycie std::string::data() zniechęci cię do leniwie przyjmującego założenia dotyczące podstawowych bitów w łańcuchu.

1

Jeśli potrzebujesz tylko odczytać dane.

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

Jeśli potrzebujesz kopii danych do odczytu/zapisu, umieść ją w wektorze. (Don; t dynamicznie alokuj przestrzeń, która jest zadaniem wektora).

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

Oczywiście wszyscy zakładamy, że bajt jest char !!!

-6

Nie sądzę, że chcesz użyć kodu C#, który tam masz. Zapewniają one System.Text.Encoding.ASCII (UTF- również *)

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

Twoje problemy wynikają z ignorowania kodowanie w C# C++ nie swój kod

Powiązane problemy