char-array uint8_t array
dies ist ein Bereich von C/C++, dass ich noch nie gut.
mein problem ist, dass ich eine Zeichenfolge, die müssen schließlich enthalten einige null-Zeichen. die Behandlung alles wie ein char-array (oder string) arbeiten nicht, wie die Dinge neigen dazu, zu Scheiße aus, wenn man die erste null. also dachte ich, ok, ich werde die Umstellung auf uint8_t, also alles ist nur eine Zahl. ich kann Dinge bewegen, wie nötig, und warf es wieder zu einem char, wenn ich bereit bin.
meine wichtigste Frage jetzt ist: wie kann ich kopieren Sie einen Teil eines string in einen uint8_t Puffer?
effektiv, ich würde gerne etwas machen wie:
std::string s = "abcdefghi";
uint8_t *val = (uint8_t*)malloc(s.length() + 1);
memset(val, 0, s.length() + 1);
//Assume offset is just some number
memcpy(val + offset, s.substr(1, 5).c_str(), 5);
offensichtlich, bekomme ich eine Fehlermeldung wenn ich versuche diese. es gibt wahrscheinlich einige Art von Betrug, dass kann getan werden, in der das erste argument der memcpy (ich sehe Sachen wie (*(uint8_t*)) online, und habe keine Ahnung, was das bedeutet).
jede Hilfe, was zu tun ist?
und während ich hier bin, wie kann ich leicht gegossen, diese wieder zu einem char-array? nur static_cast die uint8_t-pointer auf ein char-pointer?
vielen Dank.
std::string
ist durchaus mit '\0'
Zeichen. Es gibt keinen Grund, dies zu tun, es sei denn, du bist mit C-string-manipulation Funktionen, oder andere APIs, die nur nehmen char*
s mit keine Länge. Und diese APIs nicht das richtige für strings mit eingebetteten null-Werte sowieso.nach der Lektüre Ihrer Notiz, begann ich, schaut sich um. std::string arbeiten könnte. ich werde einige tests durchführen. sieht aus wie ich bin in Ordnung, so lange wie ich halten Sie Weg von c_str. ich würde immer noch gerne wissen, die Antwort auf die obige Frage, nur aus Neugier.
Dinge wie
(*(uint8_t*))
sind oft wirft ein abstrakter Datentyp ist, dann ist eine Besetzung, die wird legal an diesem Punkt war sich aber nicht zuvor, dann ein cast wieder nach unten. Es wird oft verwendet, wenn casting von Funktionszeigern, zum Beispiel (DWORD)(*(void**))(void(*)(int))
(-ish, es nicht verwendet haben, in eine Weile). Nur für Referenz. 🙂"natürlich, ich erhalte eine Fehlermeldung, wenn ich versuche, diese". Lass uns nicht raten. Welche Fehlermeldung erhalten Sie?
Sie haben mehrere falsche Annahmen. Es ist schwierig, Ihre Frage zu beantworten, wie ein Ergebnis.
char
arrays sind durchaus in der Lage zu halten nul-Zeichen, als std::string
Objekte. Weiter, es gibt nichts, dass uint8_t
bedeutet, dass char
nicht gleich gut. Bitte zeigen Sie uns, was Sie versucht haben, und wir sagen Ihnen, wo Sie falsch läuft. Können Sie erstellen, die eine 10-line-Programm, das zeigt, was schief gehen für Sie? Siehe sscce.org.InformationsquelleAutor jasonmclose | 2012-05-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht gehen, um algorithmen, die nach einem '\0' plötzlich aufhören, es zu tun, noch algorithmen, die Nutzung char haben Aufmerksamkeit zu schenken, '\0'. Signalisiert das Ende mit einem null-Zeichen ist eine Konvention von C-strings, nicht char-arrays. uint8_t könnte nur ein typedef für char sowieso.
Als Nicol Bolas Punkte aus std::string ist bereits in der Lage, die Speicherung von strings, die null-Zeichen ohne die Behandlung des null-Zeichens speziell.
Als für Ihre Frage, ich bin mir nicht sicher, was Fehler, die Sie sich beziehen, wie das folgende funktioniert:
Die memcpy-Linie nimmt die zweite bis sechste Zeichen aus dem string
s
und kopiert Sie in val. Die Zeile mit cout, dann gibt "bcdef".Natürlich ist C++, also, wenn Sie wollen, um manuell zuordnen von Speicher und keine it out Sie tun können, so wie:
oder verwenden Sie einen Vektor:
Gegossen aus einem array von uint8_t könnte man (aber sollte normalerweise nicht) Folgendes tun:
InformationsquelleAutor bames53
Gut, der code funktioniert, ok, es kopiert die Zeichenfolge in val. Sie haben jedoch 0s auf allen Positionen, bis der offset.
z.B. für offset=2 val {0, 0, b, c, d, e, f, 0, 0, 0}
Wenn Sie drucken, es wird nichts, da der string ist null-terminiert auf die erste position (ich glaube, das ist der Fehler, den Sie reden...).
InformationsquelleAutor Alexandru C.