Kann eine Datei etwas kleiner als 8 Bit teilen?

396
haelmic

Kurze Frage:

  • Was ist die kleinste Einheit, die in einer Datei gespeichert werden kann?
  • Was ist die kleinste teilbare Einheit einer Datei?

Lange Frage:

Ich habe im Internet gesucht und versucht herauszufinden, ob ich direkt in einer Datei auf etwas zugreifen kann. Überall, wo ich hinsehe, scheint es, als müssten Sie die Datei Byte für Byte lesen und dann einen Bitfilter anwenden, um das Ergebnis zu erhalten.

Bedeutet das, dass eine Datei auf einem 64-Bit-Wort-POSIX-Betriebssystem keine Dateigrößen enthalten darf, die 8 Bit nicht teilen? Dadurch wird die Frage gestellt, ob ich eine beschädigte Datei habe, die nur halbwegs gespeichert ist. Wie viel Puffer hat ich um die Datei, um auf die Daten zuzugreifen? Kann jeder Teil einer fragmentierten Datei auf einem 64-Bit-Betriebssystem nur 8 Bit oder sogar 64 Bit teilen? Wenn ich ein Programm schreibe, um binär zu lesen, gibt es dann ein undefiniertes Verhalten, auf das ich achten muss? ZB außerhalb der Grenzen von EOF oder so.

0
Obwohl getc und putc existieren, sind sie hauptsächlich und Illusion. Aus Effizienzgründen liest die Festplatte in der gesamten Branche vielleicht mehr und speichert sie im Cache, sofern Sie dies später tun wollen. Je mehr freier Speicher Sie haben, desto höher ist die Wahrscheinlichkeit, dass die gesamte Datei geheim gespeichert wird. cybernard vor 6 Jahren 0
Selbst wenn Sie das Betriebssystem zwingen könnten, 1 Bit auf einmal zu lesen, wäre die Leistung so schrecklich, dass Sie gezwungen wären, sie zu benutzen. In Linux können Sie zwingen, dass bonnie ++ jeweils nur einen Sektor liest, aber die Leistung ist so viel schlechter (Faktor 10+), als wenn das Betriebssystem damit umgehen kann, als dies von niemandem verwendet wird. cybernard vor 6 Jahren 0

1 Antwort auf die Frage

3
Cliff Armstrong

Was ist die kleinste Einheit, die in einer Datei gespeichert werden kann?

1 Bit (aber nicht wirklich. Das hängt von Ihrem Dateisystem und Ihrer Hardware ab, siehe unten.)

Was ist die kleinste teilbare Einheit einer Datei?

1 Bit

Es ist fast nie beabsichtigt, auf diese Weise auf Dateien zuzugreifen. Dies ist jedoch ein Thema der Dateiformate und der Implementierung in verschiedener Soft- und Hardware. Wenn Sie jedoch eine Datei in einem Hex-Editor öffnen, können Sie technisch nur ein einziges Datenbit ändern (beispielsweise eine 07 in eine 08). Einige Hex-Editoren geben Ihnen auch die binäre Darstellung, wodurch es noch einfacher wird, einzelne Bits von 1 auf 0 oder zurück zu kippen.

Überall, wo ich hinsehe, scheint es, als müssten Sie die Datei einen Bissen oder ein Wort nacheinander lesen und dann einen Bitfilter anwenden, um das Ergebnis zu erhalten

Dies hängt von der genauen Programmiersprache ab, die Sie verwenden. Die meisten von ihnen arbeiten jedoch eher auf Byte-Ebene als auf Bit-Ebene, da dies einfach einfacher ist. Ganz zu schweigen davon, dass das Betriebssystem und die Hardware normalerweise nicht auf Bit-Ebene arbeiten ... daher muss die Programmiersprache dies berücksichtigen. Eine bemerkenswerte Ausnahme sind jedoch boolesche Werte wie trueund false. Viele Sprachen speichern boolesche Werte als einzelnes Bit, binär 1für trueund binär 0für false. Eine weitere bemerkenswerte Ausnahme sind Ganzzahlen und Fließkommawerte, die unter den meisten Sprachen binär zählen. Bei Strings verbraucht jeder Charakter jedoch mindestens ein ganzes Byte. Bis zu 4 Byte für 32-Bit-Unicode-Zeichen.

In der Regel schreiben Sie Ihren Anwendungscode jedoch in mehreren Schritten von den "ONs" und "OFFs", aus denen er letztendlich besteht und in die er kompiliert wird. Dies liegt daran, dass der Compiler den ganzen Zweck hat, abstrakten, von Menschen lesbaren Code schreiben zu lassen, aus dem er in tatsächliche Maschinenanweisungen umgewandelt wird. Es ist eine Funktion, kein Fehler.

Überall, wo ich hinsehe, scheint es, als müssten Sie die Datei Byte für Byte lesen und dann einen Bitfilter anwenden, um das Ergebnis zu erhalten

Dateien sind eine völlig andere Dose von Würmern. Hier bestimmen Ihr Speichermedium und das von Ihnen verwendete Dateisystem Ihre minimale Dateigröße. Es hängt davon ab, mit welcher Sektorgröße das Dateisystem konfiguriert wurde und welche Mindestgröße die Speichermedien unterstützen. es können 64, 128, 512, 1024, 2048, 4096, 8192 oder sogar 16384 Bytes sein. Wenn Sie eine Datei mit einem Datenbit von 1 in ein Dateisystem mit 4096 Byte-Sektoren schreiben, nimmt die Datei 4096 Byte (oder 4 KiB) in Anspruch, obwohl sie 1/32768 der tatsächlichen Daten enthält.

Dies geschieht, weil der Umgang mit kleinen Sektorgrößen zusätzlichen Aufwand für das Speichergerät und das Dateisystem bedeutet ..., aber größere Blöcke nutzen den Speicherplatz weniger effizient. Es ist ein Kompromiss zwischen Platzeffizienz und Leistung. Ältere Festplatten verfügen normalerweise über einen physischen Sektor von 512 Byte, der Sie zwingt, 512, 1024, 2048, 4069 Byte (usw.) Sektoren zu verwenden. Optische Medien (CDs und DVDs) verwenden normalerweise 2048-Byte-Sektoren. Moderne Festplatten sind physisch für 4096-Byte-Sektoren ausgelegt. Die Raumeffizienz ist nicht so groß wie damals, als Festplatten nur 1 Gigabyte fassen konnten.

Auf einem 64-Bit-Betriebssystem hat dies keinerlei Auswirkung. 64-Bit bezieht sich darauf, wie das Betriebssystem und die darauf laufenden Anwendungen den Speicher adressieren (dh RAM). Kein Speicherplatz In der Dokumentation Ihrer Programmiersprache zu Variablen und Datentypen erfahren Sie, wie sie 32-Bit- und 64-Bit-Umgebungen anders behandelt.

Dadurch wird die Frage gestellt, ob ich eine beschädigte Datei habe, die nur halbwegs gespeichert ist. Wie viel Puffer hat ich um die Datei, um auf die Daten zuzugreifen?

Wenn Sie herausfinden, dass ein Papier darauf veröffentlicht wird, erstellen Sie ein Datenwiederherstellungsunternehmen und werden Sie schmutzig. In der Zwischenzeit hat jedes Datenwiederherstellungsunternehmen eine Meinung zu diesem Thema, und keines scheint klarer zu sein als ein anderes. Die "kurze" Antwort lautet: hängt vom Dateisystem und den Speichermedien ab (plus dem genauen, noch unbekannten Zustand des Lese- / Schreibvorgangs zum Zeitpunkt des Ausfalls).

Im Allgemeinen schreiben magnetische Speichergeräte wie Festplatten zu dieser Zeit ganze Sektoren ... also wird jeder ganze Sektor theoretisch auf einmal geschrieben. Ich kann mich nicht erinnern, ob Flash-Medien im Moment dasselbe tun oder nicht. Muss alt werden

Kann jeder Teil einer fragmentierten Datei auf einem 64-Bit-Betriebssystem nur 8 Bit oder sogar 64 Bit teilen?

Fragmentierung ist definitionsgemäß, wenn die Sektoren einer einzelnen Datei auf der Festplatte verstreut sind. Interessanterweise hat dies den Effekt, wenn eine Datei kleine Teile davon geändert hat, dass verschiedene Sektoren, die die Datei belegt, nicht vollständig gefüllt werden. So kann eine 32-KB-Datei entstehen, die 42 KiB benötigt, da viele ihrer Sektoren nur teilweise ausgelastet sind. Moderne Dateisysteme wie NTFS und ext4fs verhindern dies, aber ältere wie FAT32 waren dafür notorisch (daher war das Defragmentieren früher eine so große Sache). Außerdem ist der Speicherplatz, wie gesagt, keine seltene und geschätzte Ressource ... also kümmert es auch niemanden wirklich.

Defragmentieren bedeutet in der Regel, alle Sektoren, die eine Datei belegt, aufzugreifen und die eigentlichen Daten der Datei in einen einzigen leeren Bereich zu schreiben, der sie enthalten kann. Dabei werden alle bis auf einen teilweise verwendeten Sektor entfernt.

Und wie viele "Bits" ein OS hat dies nicht.

Wenn ich ein Programm schreibe, um binär zu lesen, gibt es dann ein undefiniertes Verhalten, auf das ich achten muss?

Binär lesen von wo? Eine Datei? Dies ist nur möglich, wenn Sie das Betriebssystem, das Dateisystem und alle mit der Steuerung Ihrer Speichergeräte verbundenen Hardwaretreiber umgehen und direkt auf das Laufwerk zugreifen. Das ist BAD JUJU . Mach das nicht. Ganz zu schweigen von modernen Betriebssystemen und Hardware, um dies als offensichtliche Sicherheitsbedrohung zu behandeln. Denken Sie auch daran, dass viele Geräte nur ein Teil mit minimaler Größe für ihre Speicherung schreiben und lesen möchten ... und es ist immer mehr als ein Bit.

Stattdessen können Sie Ihr Betriebssystem höflich nach dem kleinsten Block einer Datei fragen, die Sie über die Standard-APIs bereitstellen möchten, und dann das, was es Ihnen in Stücke gibt, zerlegen. Anschließend werden Sie nach dem Dateisystem und den Treibern gefragt, die mit der Hardware sprechen werden, und das Ganze wird koordiniert und erledigt, ohne dass Sie selbst herausfinden müssen, wie Sie diese Schritte für jeden einzelnen Speichercontroller, Dateisystem und Betriebssystem, das je erstellt wurde, selbst erledigen müssen .

Überprüfen Sie die API-Dokumente der Programmiersprache und der von Ihnen verwendeten Bibliotheken auf Details, wer dies tun soll.

ZB außerhalb der Grenzen von EOF oder so.

Kommt drauf an, was genau Sie unter Grenzen verstehen. Es gibt Terminologie, die mit der Programmierung übereinstimmt. In der Regel bezieht sich dies jedoch auf das Überschreiten der Größe eines Speicherpuffers und das Schreiben in Teile des Speichers, die Ihrer Anwendung nicht zugewiesen wurden. Dies ist auch ein schlechtes Juju ... aber ohne die Mutigen und alle Kappen. Meistens geschieht dies so oft ganz zufällig, dass die meisten Betriebssysteme Maßnahmen ergreifen, um sich selbst und andere Anwendungen davor zu schützen.

Wenn Sie jedoch von den Speichermedien schreiben oder lesen, werden Sie die APIs Ihrer Programmiersprachen und der zugehörigen Bibliotheken verwenden, die wiederum mit den APIs des Betriebssystems kommunizieren, die wiederum ... yadda yadda yadda . In der Regel ist das Dateisystem dafür verantwortlich, dass nichts geschrieben wird, wo es nicht sein sollte, und sendet normalerweise einen Fehler entlang der Kette an den Anwendungscode, wenn Sie dies versuchen.

Daumen eeh stimme für eine nette Antwort +1. Eine frühe externe Festplatte [ST-506] (https://en.wikipedia.org/wiki/ST-506) für den IBM-PC besaß, wäre ein Gigabyte ein Traum gewesen. Die "10 Megabytes" waren fast nicht erschwinglich. LotPings vor 6 Jahren 0
Flash neigt dazu, auf Seiten zu arbeiten ... 4KiB ist eine ziemlich sichere Annahme, aber natürlich kann es auch anders sein. Darüber hinaus schreibt der magnetische Speicher normalerweise nur die Daten, wohingegen Flash die Seite löschen muss (effektiv wird alles zurückgesetzt, normalerweise auf 1), bevor die Daten geschrieben werden können (normalerweise werden die 0 ausgegeben). Aus diesem Grund werden Sie häufig feststellen, dass der Flash-Speicher auf eine "bekannte gelöschte" Seite schreibt und dann eine Nachschlagetabelle aktualisiert - logisch entspricht sie nicht mehr physisch. Dies ist ein großer Teil des Verschleißniveaus. Wenn Sie das Löschen nicht als Teil des Schreibvorgangs durchführen, wird die Leistung verbessert. Attie vor 6 Jahren 1
Es ist auch erwähnenswert, dass der kleinste Teil einer Datei, den Sie anfordern können, in der Regel ein Byte ist. Wenn Sie dies jedoch tun, liest und puffert das Betriebssystem wahrscheinlich die nächsten _n_-Bytes, da dies billiger ist (die Leistung verbessert), und es wird erwartet, dass Sie bald mehr Daten benötigen. Attie vor 6 Jahren 2
Beachten Sie, dass die Änderung von 07 bis 08 ** 4 Bits ** auf einmal ändert, nicht nur eine, es sei denn, Sie verwenden einen Gray-Code-Hex-Editor phuclv vor 5 Jahren 0