Allgemeine Frage zu Binärdateien

8

Ich bin ein Anfänger und ich habe Probleme, binäre Dateien zu verstehen. Wenn ich im Binärmodus (in Python) in eine Datei schreibe, schreibe ich einfach normalen Text. Es gibt nichts Binäres daran. Ich weiß, dass jede Datei auf meinem Computer eine Binärdatei ist, aber ich habe Schwierigkeiten, zwischen Dateien zu unterscheiden, die von mir im Binärmodus geschrieben wurden, und Dateien wie Audio, Video usw., die als Kauderwelsch auftauchen, wenn ich sie in einem Texteditor öffne >

Wie werden Dateien, die als Kauderwelsch angezeigt werden, erstellt? Kannst du bitte ein Beispiel für eine kleine Datei nennen, die so erstellt wird, vorzugsweise in Python?

Ich habe das Gefühl, dass ich eine wirklich dumme Frage stelle, aber ich musste es nur fragen. Umher zu googeln hat mir nicht geholfen.

    
stirredo 26.03.2011, 17:39
quelle

6 Antworten

4
  

Wenn ich im Binärmodus (in Python) in eine Datei schreibe, schreibe ich einfach normalen Text.

Sie müssen Ihren Ansatz ändern, wenn Sie auf Python 3.x aktualisieren:

%Vor%

Aber Ihre Frage betrifft nicht wirklich binäre Dateien. Es geht um str .

In% Python 2.x ist str eine Byte Sequenz mit einer überladenen Bedeutung:

  • Eine Nicht-Unicode-Zeichenfolge oder
  • Rohe Binärdaten (wie Pixel in einem Bild).

Wenn Sie das letztere als das erste ausdrucken, bekommen Sie Kauderwelsch.

Python 3.x löste diese doppelte Bedeutung, indem es einen separaten bytes -Typ für Binärdaten einführte und% co_de zurückließ % eindeutig als Textzeichenfolge (und Unicode).

    
dan04 26.03.2011 17:56
quelle
4

Hier ist eine wörtliche Antwort auf Ihre Frage:

%Vor%

Das packt diese 4 Fließkommazahlen in ein Binärformat (Little-Endian IEEE 756 64-Bit Floating) Punkt).

Hier sind (einige von) was Sie wissen müssen:

Beim Lesen und Schreiben einer Datei im Binärmodus erfolgt keine Umwandlung der gelesenen oder geschriebenen Daten. Im Textmodus sowie bei der Decodierung / Codierung von / nach Unicode werden die Daten, die Sie lesen oder schreiben, gemäß den Plattformkonventionen für "Textdateien" transformiert.

Unix / Linux / Mac OS X: keine Änderung

älterer Mac: Zeilentrenner ist \r , geändert in / aus Python-Standard \n

Windows: Zeilentrenner ist \r\n , geändert zu / from \n . Auch (wenig bekannte Tatsache) wird Ctrl-Z aka \x1a als Dateiende interpretiert, eine Konvention, die von CP/M geerbt wurde und die Dateigrößen als die Anzahl der verwendeten 128-Byte-Sektoren aufzeichnete.

    
John Machin 26.03.2011 17:51
quelle
3

Sogenannte "Text" -Dateien sind einfach Dateien, die bestimmten Konventionen folgen: Die Bytes sind normalerweise eine Teilmenge aller möglichen Bytes, im Allgemeinen ASCII- oder Unicode-Werte, und sind in "Zeilen" mit "Zeilenabschlusszeichen" organisiert. Die Standard-Zeilenabschlusszeichen variieren je nach Plattform - Unix verwendet \n , Mac \r und Windows \r\n - also gehört es zur Konvention, diese direkt zu übersetzen. Dies funktioniert gut mit Textdateien, wird aber andere Arten von Dateien überlisten, weil ein 0x0a ( \n ) Byte in einer Sounddatei oder etwas nicht gut in 0x0d 0x0a (% co_de) konvertiert werden kann %). Natürlich, wenn Sie nur Unix verwendet haben, ist dies nicht gekommen.

In Python 3 sind alle Zeichenfolgen Unicode, und das Öffnen einer Datei als Text bedeutet, dass Sie Unicode-Zeichenfolgen lesen und schreiben müssen und möglicherweise eine Codierung angeben (standardmäßig UTF-8). Wenn Sie eine Datei als Binärdatei öffnen, müssen Sie \r\n -Objekte verwenden, die einfache Listen von 8-Bit-Bytes sind und nicht codiert werden.

Klärt dies die Dinge?

    
Tom Zych 26.03.2011 18:08
quelle
2

Binärdateien werden normalerweise erstellt, wenn Sie versuchen, Objekte zu codieren. Zum Beispiel könnten Sie ein Person-Objekt mit Eigenschaften wie Name, Alter, Höhe haben. Wenn Sie diese Datei als Text schreiben, damit sie später wieder eingelesen werden kann, könnten Sie etwas wie folgt ausgeben:

%Vor%

Aber Sie können es kompakter im Binärformat darstellen. In binärer Form könnten Sie den Namen, das Alter und die Höhe einfach nacheinander ausgeben, und Sie müssten sie genau in der gleichen Reihenfolge wieder einlesen, da Sie diese Begrenzer nicht mehr haben. In diesem Fall müsste Ihre Zeichenfolge mit etwas wie Ralph25 codiert werden. Das %code% ist das Nullzeichen, damit es weiß, wo die Zeichenfolge endet.

Der %code% kann in Text / ASCII als 2 Zeichen dargestellt werden, aber wenn Sie versucht haben, zwei Zahlen nebeneinander zu setzen, wie 25 und 26, erhalten Sie 2526 und Sie würden nicht wissen, wo Sie enden und der nächste beginnt. Diese Zahlen sind eigentlich ganze Zahlen und werden durch 4 Bytes repräsentiert. Wenn Sie eine Datei als Binärdatei schreiben, schreiben Sie alle 4 Bytes aus, auch wenn die Bits ganz links 0 sind. So weiß es immer genau, wie viel es zu lesen ist. Und so weiter ...

Aus diesem Grund sehen "Binärdateien" wie Jibberish aus, weil sie all diese zusätzlichen Informationen enthalten.

Um diese Dateien zu generieren, müssten Sie Ihre Daten wie John Machin suggerieren oder "packen".

    
mpen 26.03.2011 18:16
quelle
0

Vielleicht senden Sie eine Zeichenfolge in Ihrer Binärdatei und Ihr Computer kann sie entschlüsseln und Ihnen zeigen? Versuchen Sie, eine Datei mit einem zufälligen Byte zu schreiben. Oder Sie können uns Ihren Code zeigen, damit wir das Problem verstehen können.

    
Faleidel 26.03.2011 17:50
quelle
0

Ich empfehle, das Modul Codecs von Python zum Schreiben von Textdateien zu verwenden (es ermöglicht Ihnen, den zugehörigen Zeichensatz / die entsprechende Codierung festzulegen). Verwenden Sie zum Schreiben einer Binärdatei die Standardmethode file (). Unter Windows müssen Sie möglicherweise 'wb' oder 'rb' für binäre Modi verwenden (spielt unter Unix keine Rolle).

    
Andreas Jung 26.03.2011 17:50
quelle

Tags und Links