Binärdaten speichern - basic_string< unsigned char > vs. vector< unsigned char >
-
Gegenfrage: Was für Binärdaten hast du? Und was willst du damit machen?
-
Geht mir eigentlich allgemein um das Speichern von Binärdaten bzw. das Verwalten von denen.
Nehmen wir als Beispiel den Inhalt einer .EXE, oder sonst ein binäres Format.Bearbeiten kann ich sie bei basic_string und vector ja gleich, haben ja beide random-access-Iteratoren und sind "C-kompatibel"
-
std::vector<unsigned char>
Da gibt es auf keinen Fall Probleme, wenn mal eine 0 in den Daten auftaucht.
-
Ponto schrieb:
std::vector<unsigned char>
Da gibt es auf keinen Fall Probleme, wenn mal eine 0 in den Daten auftaucht.
Teste mal folgendes Programm:
#include <iostream> #include <string> int main() { std::string str( 10, '*' ); str[ 4 ] = 0; std::cout << str << '\n'; std::cout << str.c_str(); }Das ist das schöne an basic_string es erkennt das Stringende nicht wie C an einer 0, sondern arbeitet mit der Größe

-
boost::array<char>
-
Any schrieb:
Das ist das schöne an basic_string es erkennt das Stringende nicht wie C an einer 0, sondern arbeitet mit der Größe
Probier doch mal das:
#include <iostream> #include <string> int main() { std::string str( "Hallo \0 welt!"); std::cout << str.c_str(); }Das soll keine Spitzfindigkeit sein. Wollte nur sagen, dass bei string aufpassen muss wie man die Daten in den Container bekommt.
-
Toll.

-
Wenn du die String-Funktionalitäten nicht brauchst, würde ich auch vector<> bevorzugen - selbst wenn's nicht viel ist, dürfte string doch etwas Overhead gegenüber vector haben, um Zeichenketten-Arithmetik effizienter durchführen zu können.
-
@Templäd schau dir mein Beispiel nochmal an (am besten mal starten), ich habe genau das von dir genannte Verhalten dort demonstriert (string verwendet keine 0 als Stringende, cstrings tun es).
-
Ok danke, dann werde ich zukünftig vector verwenden.