C++ string mit Binärdaten

AMoKx666

Mitglied
hallo,
ich habe einen std::string der \0 enthalten kann, also mit binärdaten gefüllt ist. wie kann ich jetzt ermitteln, wie groß der string ist. Er zählt bei mir leider nur bis zum ersten auftretenden \0. Alles was dahinter kommt wird nicht berücksichtigt. gibts irgendeine Möglichkeit zu ermitteln, wie groß der string wirklich ist ?
 
Hi.
hallo,
ich habe einen std::string der \0 enthalten kann, also mit binärdaten gefüllt ist. wie kann ich jetzt ermitteln, wie groß der string ist. Er zählt bei mir leider nur bis zum ersten auftretenden \0. Alles was dahinter kommt wird nicht berücksichtigt. gibts irgendeine Möglichkeit zu ermitteln, wie groß der string wirklich ist ?
Wenn du die Daten wirklich komplett in einem std::string, dann mußt du nur std::string::size() aufrufen. Ansonsten hast du die Daten noch gar nicht richtig in den std::string übernommen.

Gruß
 
@deepthroat
das problem ist, dass ich nur alles in den string hinein bekomme, wenn ich die Größe kenne.
Bsp:
std::string test = "test\0test";
Als Ausgabe bekomme ich dann nur "test". Die Größe mit length() oder size() beträgt dann 4.

wenn ich die Größe mit angebe, dann funktioniert es.
std::string test("test\0test", 9);
Hier ist die Ausgabe korrekt und die Größe wird mit 9 angegeben.

Und genau hier beisst sich die Katze selbst in den Schwanz. Solange ich die Größe nicht Korrekt angebe, bekomme ich nicht den kompletten String.
 
Und genau hier beisst sich die Katze selbst in den Schwanz. Solange ich die Größe nicht Korrekt angebe, bekomme ich nicht den kompletten String.
Ja, das ist klar. Wenn du einen ein char-Array verarbeiten willst mußt du die Größe kennen. Deshalb wird bei allen solchen Funktionen (memcpy, memcmp, etc.) die Größe mit übergeben.

\edit: evlt. gibt es ja ein anderes Zeichen welches du als Terminierung der Daten verwenden kannst? Oder du verwendest 2 \0 Zeichen hintereinander. Wo kommen denn die Daten her?

Gruß
 
@deepthroat
das sind Binärdaten eines Bildes. Es kann also auch sein, das in einem Bild mehrere \0 vorkommen, d.h auch mehr als 2. Wieviele oder ob überhaupt, bzw. wo sie vorkommen, weiss ich vorher natürlich nicht. deshalb ist es eben wichtig zu wissen, wie groß der string tatsächlich ist. Ich baue mir die Strings auch nicht selbst zusammen, d.h. ich kann also nicht sicherstellen, dass eben keine \0 enthalten sind.
 
@deepthroat
das sind Binärdaten eines Bildes. Es kann also auch sein, das in einem Bild mehrere \0 vorkommen, d.h auch mehr als 2. Wieviele oder ob überhaupt, bzw. wo sie vorkommen, weiss ich vorher natürlich nicht. deshalb ist es eben wichtig zu wissen, wie groß der string tatsächlich ist. Ich baue mir die Strings auch nicht selbst zusammen, d.h. ich kann also nicht sicherstellen, dass eben keine \0 enthalten sind.
Ja, aber irgendwie mußt du die Daten des Bildes ja lesen. Ob vom Dateisystem oder vom Internet über HTTP etc. da weißt du ja immer wie groß die Daten sind.

Gruß
 
Ich weiß nicht wie du die Daten ausließt, aber ich könnte mir vorstellen, dass wenn du sie mit einem fstream binär ausließt und binär in einen Stringstream schreibst, statt in einen std::string, dass sich das Problem dann erübrigt.

Ist allerdings nur eine Vermutung.
Gruß Ryu
 
ich bekomme die Bilddaten von einer Funktion aus einer Lib. Woher diese die Bilder nimmt kann unterschiedlich sein. Ändert aber nichts an der Tatsache, dass ich keine Größe bekomme. Ich muss die Bilder als Blob in einer Datenbank ablegen. Um das machen zu können, muss ich sie vorher allerdings escapen. Um zu escapen gibts in der MySQL C Api ne Funktion mysql_real_escape_string. Die Funktion benötigt allerdings die Größe. Wenn ich aber bei meinem String die Größe nicht selbst angebe, geht er, wie ich bereits beschrieben habe nur bis zum ersten \0.

Ganz allgemein, egal woher die Daten nun kommen, muss es doch irgendeine Möglichkeit oder Methode geben die Größe zu ermitteln.
 
Zurück