Wie kann ich eine Datei "binär" in eine Variable speichern?


Stehfan

Grünschnabel
Hallo zusammen.

Ich suche mich schon seit Tagen durch Webseiten und Foren um heraus zu finden, wie ich eine Datei binär einlesen kann. Auf eine bestimmte Sprache zur Umsetzung habe ich mich noch nicht festgelegt, tendiere aber zu Ruby.

Folgendes Beispiel erklärt hoffentlich, was genau ich vorhabe:

Ich habe eine Datei hallo.txt in der das obligatorische "Hallo Welt!" steht. Schaue ich mir diese Datei nun mit einem Hexeditor in der Binäransicht an, werden mir die einzelnen Bits von "Hallo Welt!" angezeigt:

01001000 01100001 01101100 01101100 01101111 00100000 01010111 01100101 01101100 01110100

Das selbe möchte ich nun mit einem kleinen Programm durchführen:

  1. Datei einlesen
  2. Inhalt am besten direkt oder nach Umwandlung "binär" in eine Variable schreiben und dann mit dieser weiter arbeiten können.

Das sollte doch mit wenigen Befehlen möglich sein, oder?

Später möchte ich das selbe dann auch in die andere Richtung durchführen, also andere Binärdaten (z.B. die eines "Hallo zurück") wieder in eine hallo.txt schreiben.

Wie genau gehe ich vor? Welche Sprache empfiehlt sich und welche Befehle brauche ist?

Bin für jeden Denkanstoß dankbar.
 

vfl_freak

Premium-User
Moin und Willkommen hier auf Tutorials.de !

Offen gestanden verstehe ich ganz und gar nicht, was Du da versucht ....

Da Du eine Textdatei hast, stehen dort die Zeichen selbstverständlich binär drin, Du kannst sie aber doch auch byteweise auslesen.
Die ersten acht bit "01001000" sind ja dezimal "72" oder hexadezimal "0x48" oder eben der Buchstabe "H" ...
Das ist alles äquivalent !

Wozu musst dass denn nun in binärer Form verarbeiten?

Und was meinst Du mit "welche Sprache / welche Befehle"?
Welche Programmiersprachen kennst Du denn ? ? ?

Gruß
Klaus
 

Stehfan

Grünschnabel
Moin und danke für deine Antwort.

Sagen wir es mal so:

Arbeitsbedingt kenne ich mich mit PHP einigermaßen gut aus (als Supporter, nicht als Entwickler. Fehlermeldungen im bestehenden Code verstehen und selbst beheben oder weiter leiten), da das ganze aber eine Desktopapplikation werden soll, muss ich mich so oder so in eine neue Sprache einarbeiten.

Und da mache ich es dann von der Anforderung abhängig, in welcher Sprache sich meine Anforderung am einfachsten umsetzen lässt.

Es geht mir weniger darum, das "H" wieder aus zu lesen sondern mehr darum, den gesamten Inhalt der Datei als eine Binärzahl zu haben und diese dann weiter zu verarbeiten. Wenn ich z.B. statt einer Textdatei ein Bild oder eine Audiodatei nehme (ich weiss, dass das eine ziemlich große Zahl werden wird), dann besteht der Inhalt ja weiterhin aus 1 und 0 und nicht mehr aus Buchstaben.

Wenn ich dann aber diese "Binärkette" auf einem anderen PC wieder als Datei schreibe, dann habe ich die ursprüngliche Datei wieder her gestellt (jedenfalls erhoffe ich mir das ganze so).
 

sheel

I love Asm
Hi

wenn es dir nur darum geht, den Inhalt woanders gleichwertig zu haben,
bleib bei den Byte. Geht genau so gut.

In Wirklichkeit hast du das Ganze ja als Binärzahl, es sind nur immer 8 Ziffern geblockt:
in ein Byte eben.

Wenn du die Binärzahl so haben willst, dass der Benutzer Nullen und Einsen sieht
musst du das mit jeweils 8 Buchstaben (bzw. Ziffern) machen, von denen jede ein Byte braucht.
Die Umrechnung wäre kein Problem, dein Speicherverbrauch würde sich aber eben verachtfachen.
 

deepthroat

Erfahrenes Mitglied
Hi.

Das kannst du ziemlich mit jeder Sprache machen.

Du mußt nur jedes Byte in die Binärform kovertieren (dezimal => binär-String).

Datei einlesen, Schleife über jedes Byte, Funktion aufrufen, fertig.

Dir ist aber schon klar, dass sich dadurch die Datenmenge (so ziemlich genau ;)) verachtfacht?

Gruß
 

vfl_freak

Premium-User
hmm,

wie gesagt: "01001000" = "72" = "0x48" = "H" ...

Was konkret in der Datei steht ist eigentlich eher unerheblich, wichtig ist, wie Du es in Deinen Programm interpretierst, darstellst oder was auch immer.

Den gesamten Dateiinhalt als EINE Zahl darstellen zu wollen, wird Dich, Deinen Rechner und uns alle hier schlichtweg überfordern :D

Programmiersprachen bieten halt die Möglichkeit eine Datei zeichenweise einlesen und dann als char-Array oder als String, aber auf Integer- bzw. BYTE-Array darzustellen.

Gruß
Klaus
 

Stehfan

Grünschnabel
Wahrscheinlich ist das, was ich vorhabe eh total schwachsinnig, vielleicht kommt aber auch etwas total tolles dabei raus ;)

Ich versuchs nochmal anders zu erklären, wahrscheinlich sagt ihr mir dann gleich, dass es schwachsinnig ist, aber dann muss ich mir darüber wenigstens keine weiteren gedanken mehr machen ;)

Nehme ich als Beispiel nur "Hallo" als Inhalt, dann sieht das ganze Binär ja wie folgt aus:

0100100001100001011011000110110001101111

ergibt dann dezimal

310872140911

Bei einer größeren Datei gibt es eine deutlich größere dezimal-Zahl, die man dann sicherlich in irgendeine (deutlich kürzere) mathematische Formel bringen kann.

Am Ende (also wirklich ganz am Ende, wenn das ganze überhaupt funktioniert, was ich rausfinden möchte) habe ich dann eine mathematische Formel, die mein Programm einliest. Aus der Formel lässt sich dann eine sehr große dezimal-Zahl errechnen, die wiederrum in binär umgewandelt wieder in eine Datei geschrieben wird.
 

sheel

I love Asm
Du willst eine math. Formel generieren, die als Ergebnis in Binär die gesamte Datei ergibt?
Wozu soll das eigentlich gut sein?

Zwei Problempunkte am Ganzen:
a) Die normalen Datentypen wie int usw. können nur sehr begrenzte Zahlen aufnehmen.
Über 8 Buchstaben/Byte wirst du nicht mit einer Variable kommen, und das musst du aber, um damit rechnen zu können.
Eine Mögliche Lösiung wäre die Verwendung von Libs wie GnuMP, die praktisch unbegrenzt große Variablen anbieten.
b) Aus einer Zahl eine math. Formel generieren?
Naja, "Zahl+0" ist ja einfach zu machen, aber sonst...nach welchen Kriterien soll die Formel zusammengestellt werden?
Der Computer hat ja kein Gehirn...

Aber nocheinmal: wozu soll das gut sein?

edit: Willst du die Datei damit speicherplatz-sparender machen?
Warum nicht fertige Libs für ZIP/RAR verwenden?
Oder, wenn man das selber programmieren will:
Der Huffmann-Algorithmus ist ein guter Einstieg.
 

Stehfan

Grünschnabel
Mir geistert seit Jahren die Idee durch den Kopf, dass es doch irgendwie möglich sein muss, eine größere Datei (z.B. ein 100 MB ISO einer Linux-Distribution) in eine Formel zu bringen.

Man überträgt dann nicht mehr die Datei sondern nur eine Rechnung, aus der dann die Ursprüngliche Datei wieder "berechnet" werden kann. Wie genau das ganze funktioniert wollte ich austesten, dazu brauche ich aber überhaupt erstmal die Möglichkeit, eine Datei in eine "Zahl" um zu wandeln und die "Zahl" dann später wieder in eine Datei.

Aber wahrscheinlich ist es am besten, wenn ich die Idee einfach begrabe :(
 

sheel

I love Asm
Möglich ist das schon, nur schwierig.

Aber noch ein mal: Was willst du am Ende erreichen?
Ist wirklich "nur" die Formel das Ziel?
Oder erwartest du dir davon eine sehr hohe Speicherplatzeinsparung?
Oder...?

Zur Formel: Da wären genauere Angaben gut.
Erlaubte Rechenarten? Sonstige Vorschriften/Merkmale? ...?
 

Stehfan

Grünschnabel
Der Grundgedanke war/ist:

Nicht überall ist schnelles Internet verfügbar. Schnelle Computer sind hingegegn fast überall vorhanden. Warum also nicht geringe Bandbreite durch Prozessorleistung ausgleichen?

Die gewünschte Datei wird analysiert, verschiedene Formeln werden durchgetestet (die dann eben erstmal noch gefunden werden müssen) und die kleinste Formel wird an den Client gesendet, der daraus dann wieder die Datei "berechnet".

Angenommen man kauft sich ein digitales Produkt mit 8 Gb größe, dann dauert es je nach Anbindung Stunden oder gar Tage, bis diese 8 Gb herunter geladen sind. Wenn ich jetzt aber etwas abstrakt denke und z.B. eine Formel/Rechnung habe, die einige Mb groß wäre, dann kann ein Computer die ursprüngliche Datei in einer viel kürzeren Zeit neu berechnen. Man kann (und sollte auch, da der Arbeitsspeicher begrenzt ist) die 8 Gb dann auch aufteilen, z.B. in 100 Mb Pakete. In der Berechnungsdatei stehen dann die Formeln aller Pakete und am Ende werden diese wieder zusammen gesetzt.

Die Formel könnte z.B. aus Wurzeln bestehen oder aus Potenzen, die eine möglichst große Zahl ergeben und der "Rest" wird übergeben: 1234^56789+1287218738172

Das ist halt alles nur theoretisch ... die Ursprungsfrage zielt darauf ab überhaupt eine Zahl zu bekommen, an der ich die Machbarkeit testen kann.
 

sheel

I love Asm
Also wirklich Speicherplatzeinsparung/Komprimierung generell.

An sich ist es ja keine schlechte Idee...und das "Entpacken" würde auch ziemlich flott gehen.
Nur...das Komprimieren selber wird
entweder so gut wie nie vernünftige Verkleinerungen bringen
oder die Leistung eines Standardcomputers um Welten übersteigen.

Sorry, aber bleib besser bei den bekannten Komprimiermethoden.
 

Neue Beiträge