Nach meinem früheren question. Gibt es eine Möglichkeit, eine Zeichenfolge in einer komprimierten/Bit-Version unter Verwendung von C++ - systemeigenem Idiom zu schreiben. Ich denke etwas wie Perls Eingeborener pack and unpack.C++ Native Weg zum packen und entpacken String
Antwort
Basierend auf dem Lesen Ihrer vorherigen Frage, ich denke, Sie meinen, dass Sie eine binär codierte Ausgabe, lieber als eine "komprimierte" Ausgabe wollen. Im Allgemeinen wird "komprimiert" verwendet, um sich speziell auf Daten zu beziehen, die durch die Anwendung eines Algorithmus wie der LZW-Codierung in der Größe reduziert wurden. In Ihrem Fall können Sie feststellen, dass die Ausgabe in dem Sinne "komprimiert" ist, dass sie kleiner ist, da für eine große Anzahl von Zahlen eine binäre Darstellung effizienter ist als eine ASCII-Darstellung, aber dies ist keine "Komprimierung" im herkömmlichen Sinne Vielleicht haben Sie deshalb Schwierigkeiten, die Antwort zu bekommen, nach der Sie suchen.
Ich glaube, Sie wirklich fragen, die folgenden:
eine Zahl im ASCII-Format Given (gespeichert in einem std :: string, zum Beispiel), wie kann ich diese in einer Datei als binäre Codierung integer schreiben ?
Es gibt zwei Teile der Antwort. Zuerst müssen Sie die ASCII-codierte Zeichenfolge in einen ganzzahligen Wert konvertieren. Sie können eine Funktion wie strtol verwenden, die eine lange Ganzzahl liefert, die dem Wert Ihrer ASCII-codierten Zahl entspricht. Beachten Sie, dass die Größe der Zahl, die in einer langen Ganzzahl dargestellt werden kann, begrenzt ist. Wenn Ihre Zahlen also sehr, sehr groß sind, müssen Sie diese möglicherweise kreativer umsetzen.
Zweitens müssen Sie die Daten mit ostream :: write() in den Ausgabestream schreiben, der nicht versucht, die von Ihnen angegebenen Bytes zu formatieren. Wenn Sie einfach den Standardoperator < <() stream operation verwenden, um die Werte zu schreiben, werden Sie feststellen, dass Ihre Zahlen einfach zurück in ASCII übersetzt und auf diese Weise ausgegeben werden. Setzen Sie das alles so zusammen:
#include <stdlib.h> // For strtol().
#include <arpa/inet.h> // For htonl().
#include <fstream> // For fstream.
#include <string> // For string.
int main(int argc, char *argv[]) {
char *dummy = 0;
std::string value("12345");
// Use strtol to convert to an int; "10" here means the string is
// in decimal, as opposed to, eg, hexadecimal or octol, etc.
long intValue = strtol(value.c_str(), &dummy, 10);
// Convert the value to "network order"; not strictly necessary,
// but it is good hygiene. Note that if you do this, you will
// have to convert back to "host order" with ntohl() when you read
// the data back.
uint32_t netValue = htonl(intValue);
// Create an output stream; make sure to open the file in binary mode.
std::fstream output;
output.open("out.dat", std::fstream::out | std::fstream::binary);
// Write out the data using fstream::write(), not operator<<()!
output.write(reinterpret_cast<char *>(&netValue), sizeof(netValue));
output.close();
}
Wenn nichts anderes, glaube ich, dass Sie immer Perl-Header und Bibliotheken einklappen könnten. Siehe perlguts.
Eigentlich habe ich genau das für meine libperl ++ gemacht. Wenn ich nicht schon Perl einbettle, würde ich mich für eine andere Lösung entscheiden. –
Ich habe Mut für ein bisschen Inline :: C Programmierung verwendet - und ich war erfreut darüber, wie einfach es war, den * C * Teil von Perl zu benutzen (nicht um Subs aufzurufen) und den gleichen Nutzen aus Perl zu ziehen Hashes und Perl-Listen ohne eine ganze Menge zusätzlicher Codierung. Ich machte hauptsächlich Arbeiten vom Typ C mit Perl-Eingeweiden. – Axeman
Eigentlich habe ich das auf meiner TODO-Liste, aber ich habe es noch nicht geschrieben. Ein Paket sollte ziemlich einfach typsicher zu schreiben sein (Serialisierung ist gar nicht so schwer, wirklich), auf der anderen Seite habe ich es noch nicht komplett herausgefunden. –
Ich denke, Sie sollten mehr Informationen über Ihre Plattform und die genaue Codierung für Ihre Zeichenfolge geben. Packis ist sehr flexibel. – weismat
Ich habe eine kleine Bibliothek geschrieben, um diese Funktion zu machen. Sie befindet sich in Google Code hier: code.google.com/p/packlib/ – Bluefalcon