Binärcode einer Datei auslesen und in einer Variable speichern
-
Du meinst also, dass ich in einer Schleife den C-String (das char Array) teilweise in Binärcode umwandeln solle?
Also z.B. so?
char cstring[] = "Hallo Welt"; for(int i = 0; i < (sizeof(cstring) / sizeof(cstring[0])); i++) { cstring[i] = // Umwandlung in Binärcode }
(Bei der Gelegenheit könnte man direkt den C-String in String umwandeln)
Oder soll ich einen char (ein Byte) nochmal in die einzelnen Bits klein hacken und dann in Binärcode umwandenln? Da weiß ich nur noch nicht wie das geht..
Wär super nett, wenn mir jemand auch das noch erklären könnte!
-
Was soll denn "Binärcode" sein?
Der String"hallo"
liegt als Folge von 6 Bytes binär im Speicher. Da gibt es nichts umzuwandeln. Der Speicher ist sowieso immer binär aufgebaut.
Um an die einzelnen Bits zu kommen verwendet man Operatoren wie&
und<<
. Das sollte bei einer einfachen Komprimierung aber gar nicht notwendig sein.
-
Hm.. ich glaub ich hab deine Frage falsch verstanden, aber ich versuch sie trotzdem mal zu beantworten:
aabb ist ziemlich viel kürzer
0100 0110 1001 0100 0110 1001 1110 0101 0111 1110 0101 0110
-
[quote=TyRoXx]Was soll denn "Binärcode" sein?[/quote]
Hättest du alle Beiträge gelesen solltest du das wissen, denn diese Frage habe ich schoneinmal beantwortet^^
[quote=TyRoXx]Der String "hallo" liegt als Folge von 6 Bytes binär im Speicher. Da gibt es nichts umzuwandeln. Der Speicher ist sowieso immer binär aufgebaut. [...] Das sollte bei einer einfachen Komprimierung aber gar nicht notwendig sein.[/quote]
Wieso ich das will würdest du auch wissen, hättest du alle Beiträge gelesen (und verstanden!).
-
Folgendes Beispiel ist eine sehr einfache Komprimierung auf Byte-Ebene. Was ist jetzt der Unterschied zu deinem Verfahren?
#include <vector> #include <string> #include <iostream> #include <limits> typedef int short_can_hold_two_chars[sizeof(unsigned short) >= (2 * sizeof(unsigned char))]; std::vector<unsigned short> compress(const std::string &str) { std::vector<unsigned short> data; unsigned char count = 0; char last; for (size_t i = 0; i < str.size(); ++i) { const char current = str[i]; if ((i > 0) && (current != last) || (count == std::numeric_limits<unsigned char>::max())) { const unsigned short word = (((unsigned char)last) << 8) | count; data.push_back(word); count = 0; } last = current; ++count; } if (count > 0) { const unsigned short word = (((unsigned char)last) << 8) | count; data.push_back(word); } return data; } std::string uncompress(const std::vector<unsigned short> &data) { std::string str; for (size_t i = 0; i < data.size(); ++i) { unsigned short word = data[i]; unsigned char count = word & 0xff; unsigned char character = (word >> 8) & 0xff; str.append(count, character); } return str; } using namespace std; int main() { while (true) { string str; getline(cin, str); if (str.empty()) break; const vector<unsigned short> data = compress(str); cout << "Compressed: " << data.size() << (data.size() == 1 ? " word" : " words") << endl; const string test = uncompress(data); cout << "Test: " << test << endl; } }
-
Der Unterschied ist, dass dein Code für mich in großen Teilen unverständlich ist.
Ich möchte nicht Alternative bessere Lösungen haben, sondern einfach nur die Lösung für mein Problem.
-
//PAT// schrieb:
iwie bekomme ich trotz ios::binary nicht den Binärcode, sondern den Standard Text
[...]
Hier mein Code:int main (int argc, char **argv) { int length; char* buffer; string value; ifstream file; file.open("Lorem ipsum.rtf", ios::binary); if(file.is_open() != true) { cerr << "Konnte Datei nicht oeffnen! \n"; return 1; } file.seekg (0, ios::end); length = file.tellg(); file.seekg (0, ios::beg); buffer = new char[length]; file.read(buffer, length); file.close(); cout.write(buffer, length); delete[] buffer; return 0; }
Ist doch alles korrekt.
Wenn im File der Text "hallo" stehen und du diese als char* ausgibst, dann kommt logischerweise "hallo", weil zwischen dem text "hallo" und dem Binärcode von "hallo" kein Unterschied existiert.Wenn du eine Ausgabe von "10010011" willst, dann ist diese genauso lang wie "hallo du".
Das Zeichen '1' ist kein gesetzes Bit, sondern eine Zahl. Schau dir mal http://de.wikipedia.org/wiki/Ascii an.
-
Achso also bekomme ich mit dem Perl Befehl oben auch nur den ASCII Code heraus?
Hier steht, dass dies den Binärcode einer Datei ausgibt. Langsam steh ich auf dem Schlauch..
Aber ich glaub ich stell meine Frage mal anders: Wie kann ich eine Datei auslesen und sie komprimieren (bzw. zusammenfassen)? Bisher dachte ich, dass ich einfach den (wasauchimmerjetzt)Code der Datei hätte zusammenfassen können und in eine neue Datei hätte schreiben können, und bei der Dekomprimierung dann anhand der Datei die andere Datei wiederherstellen können. Mittlerweile, denke ich aber eher, dass das eher ein Verschlüsselungsverfahren wäre und keines Falls ein Komprimierungsverfahren.
Hoffe mir kann noch jemand helfen.
LG PAT
-
Hat sich erledigt, ich hab jemand anderen gefunden ders mir erklärt hat
Danke trotzdem an alle!
LG PAT
__________________________________
Würd mich über nen Gästebucheintrag freuen
-
//PAT// schrieb:
Hat sich erledigt, ich hab jemand anderen gefunden ders mir erklärt hat
Danke trotzdem an alle!
LG PAT
__________________________________
Würd mich über nen Gästebucheintrag freuenHallo Pat,
ich arbeite momentan an einem Projekt mit C und bin auf ein ähnliches Problem wie du gestossen. Ich würde gerne besser die Grundlagen verstehen, daher könntest du grob skizzieren, was nun die Lösung zu deinem Problem war? Danke!Ciao, dummy2k