Hexadezimales Format und Speicherung auf einer Computerfestplatte: Speichert es in der Hälfte der Bytes?

3074
J. J.

Lassen Sie mich vorwegnehmen, dass ich kein Computerspezialist bin. Vor allem bin ich neugierig auf die Informationen.

In einem Gespräch mit einem Informatikspezialisten wurde mir gesagt, dass eine Reihe von numerischen Dezimalwerten, z. B. 73829182093, auf einer Festplatte gespeichert werden kann, die nur die Hälfte der benötigten Bytes belegt, indem ein Hexadezimalsystem verwendet wird. Wie der Fachmann gesagt hat, könnte eine Zeichenkette mit sechs Dezimalzahlen als 3 Byte gespeichert werden, da jede Zahl durch eine Hexadezimalstelle dargestellt werden kann, die nur 4 Bit groß ist. Ist dies in Bezug auf die Speicherung auf einer Festplatte korrekt? Hinweis: Ich beziehe mich auf Speicher auf einer Festplatte, nicht auf den zur Anzeige benötigten Speicher.

Ich verstehe bisher, dass alle Informationen in binärer Form (0 und 1) auf Festplattenlaufwerken und in Blöcken von 8 Bits auf modernen Computerfestplatten gespeichert wurden. Dieses Hexadezimalwert wird verwendet, um die Anzeige von Informationen zu erleichtern, sodass der Mensch nicht lange Blöcke von Bits durchlesen muss.

Wenn dies zutrifft, bedeutet dies, dass in einem bestimmten Szenario ein Block von 8 Bits auf einer Festplatte unter einem hexadezimalen Speicher statt zwei vollen Datenbytes anstelle von 8 vollen Bits für ein Zeichen codiert. wie der Buchstabe "M"? Oder auf einer Festplatte: Wird das halbe Byte tatsächlich mit den vollen 8 Bit dargestellt und dann bei der Anzeige einfach weggelassen?

Vielen Dank.

4
Tatsächlich speichern Festplatten Festplatten in Sektoren, z. B. 512 Bytes. Wenn Sie ein einzelnes Bit in einem Byte auf der Festplatte ändern, müssen Sie den gesamten Sektor neu schreiben. Ron Maupin vor 7 Jahren 0
@RonMaupin Aber es spielt keine Rolle, und auch das ist willkürlich. Auf unserer Seite (und bei "unserer Seite" ziehe ich diese Linie bei Kernel- / Treiberentwicklern), * scheinen * sie mit Bytes zu arbeiten, und solange sie dies tun, ist es uns egal, wie der Speicher selbst ist * umgesetzt *. Jason C vor 7 Jahren 0

3 Antworten auf die Frage

4
Horn OK Please

Ich verstehe bisher, dass alle Informationen in binärer Form (0 und 1) auf Festplattenlaufwerken und in Blöcken von 8 Bits auf modernen Computerfestplatten gespeichert wurden. Dieses Hexadezimalwert wird verwendet, um die Anzeige von Informationen zu erleichtern, sodass der Mensch keine langen Bitblöcke durchlesen muss.

Das ist zu 100% korrekt. Hexadezimal ist nur eine Darstellung von Daten; Die Natur von Hexadezimalwerten ist im Vergleich zu anderen Formaten nichts Besonderes. Es ermöglicht keine Datenkomprimierung oder ähnliches.

Ich denke, worauf sich Ihr Freund bezogen hat, ist der Unterschied zwischen der Darstellung von Zahlen als Zeichenketten und der Darstellung von Zahlen als Zahlen .

Für vorzeichenlose Ganzzahlen - dies ist eine Darstellung von Zahlen in Bits (Nullen und Einsen) von 0 bis zu einer bestimmten, festen Höchstzahl -, kann die maximale Anzahl, die durch N Bits dargestellt werden kann, 2 ^ N, minus 1, vorausgesetzt, Sie Beginne mit 0.

Wenn Sie also 8 Bit (1 Byte) haben, können Sie jede Zahl von 0 bis 255 darstellen, ohne Informationen zu verlieren. Sie können diese acht Bits zwischen 0 und 1 bearbeiten, um jede Zahl von 0 bis einschließlich 255 eindeutig darzustellen. Oder von 1 bis 256, wenn Sie möchten. Es spielt keine Rolle Computer neigen dazu, sie ab 0 zu repräsentieren.

Wenn Sie 16 Bits (2 Bytes) haben, können Sie jede Zahl von 0 bis 65535 (das sind 2 ^ 16 - 1) darstellen. 32 Bit, jede Zahl von 0 bis 4294967295. 64 Bit, jede Zahl von 0 bis eine Zahl von 1,8 mit neunzehn Nullen .

Aus der Algebra wissen Sie vielleicht, dass 2 ^ N eine Exponentialfunktion ist. Das bedeutet, dass, obwohl 64 Bits nur achtmal mehr Bits als 8 Bits sind, es viel mehr Daten in den achtfachen Bits speichern kann als die Anzahl 255*8(die nur 2040 ist!). 2040 ist eine sehr kleine Zahl im Vergleich zu ungefähr 180000000000000000000. Und 64 Bits können JEDE Zahl von 0 bis zu diesem Maximum speichern.

Eine interessante Implikation für auf diese Weise gespeicherte Ganzzahlen ist, dass der Programmierer im Voraus entscheiden muss, wie groß der Speicher sein muss, was wiederum die maximale Anzahl bestimmt, die durch eine bestimmte Ganzzahl dargestellt werden kann. Wenn Sie versuchen, eine Nummer zu speichern, die größer ist, als der Speicher verarbeiten kann, wird ein so genannter Überlauf angezeigt . Dies ist beispielsweise der Fall, wenn Sie eine 8-Bit-Ganzzahl haben, die auf 255 eingestellt ist, und Sie den Computer auffordern, eine 1 hinzuzufügen. Nun, Sie können nicht 256 innerhalb einer ganzen Zahl darstellen, deren Bereich zwischen 0 und 255 liegt! Was normalerweise passiert, ist, dass es wieder an den Anfang zurückkehrt und auf 0 zurückgeht.

Es gibt Programme, die Mathematik in einem Modus ausführen, der als "willkürliche Genauigkeit" bezeichnet wird und die Größe des Speichers automatisch ändert, um immer größer zu werden. Wenn Sie beispielsweise 255 mit 100000 multiplizieren, müsste die Antwort über 8 Bit und über 16 Bit hinaus wachsen, würde aber in eine 32-Bit-Ganzzahl passen. Wenn Sie eine Zahl eingeben oder eine mathematische Operation ausführen, bei der eine Zahl größer als der Maximalwert für eine 64-Bit-Ganzzahl ist, muss sie noch mehr Speicherplatz zuweisen.


HOWEVER - wenn Sie Zahlen als Zeichenkette darstellen, nimmt jede Zahl so viel Platz wie ein Buchstabe in der Prosa. "ASDF" und "1234" nehmen genau den gleichen Platz ein. "OneTwoThreeFourFive" (19 Zeichen) nimmt den gleichen Platz wie "1234567890123456789" ein. Der erforderliche Speicherplatz wächst linear mit der Anzahl der Zahlen (oder Buchstaben oder Zeichen, die generisch vorhanden sind). Das liegt daran, dass jedes Zeichen eine Vielzahl von Zeichen innerhalb des Zeichensatzes darstellen kann und Zahlen nur Zeichen in einem Zeichensatz sind. Eine bestimmte Folge von Nullen und Einsen erzeugt die Zahl "3", eine andere Folge erzeugt "4".

Typischerweise werden Zeichen gespeichert, die entweder 8 oder 16 Bit aufnehmen, aber einige Zeichencodierungen nehmen je nach Zeichen entweder eine variable Anzahl von Bits (wie UTF-8) oder immer eine größere Anzahl von Bits (wie UCS-32) in Anspruch. .

Wenn jedes Zeichen 8 Bits benötigt, beanspruchen "OneTwoThreeFourFive" und "1234567890123456789" jeweils 152 Bits. "1234567890123456789" kann jedoch in eine 64-Bit-Ganzzahl ohne Vorzeichen passen, die ... nur 64 Bit verbraucht . Das spart 88 Bit! Und wir haben nicht einmal "Datenkomprimierung" -Tricks wie Zip, 7-Zip, RAR usw. verwendet.

2
Jason C

Ich verstehe bisher, dass alle Informationen in binärer Form (0 und 1) auf Festplattenlaufwerken und in Blöcken von 8 Bits auf modernen Computerfestplatten gespeichert wurden. Dieses Hexadezimalwert wird verwendet, um die Anzeige von Informationen zu erleichtern, sodass der Mensch keine langen Bitblöcke durchlesen muss.

Ihr vorheriges Verständnis ist genau richtig, und ich habe das Gefühl, dass Sie den Rest dieser Antwort bereits verstehen, aber ich möchte ein paar Ideen erläutern, die Menschen oft miteinander verbinden. Ich werde versuchen, so kurz wie möglich zu sein, aber es wird schwer werden.

Bytes, Speicher

Daten werden normalerweise auf einer Festplatte (oder im Arbeitsspeicher) in 8-Bit-Blöcken gespeichert, die als Bytes bezeichnet werden. Ein einzelnes Bit hat zwei mögliche Werte, die wir per Konvention als 0 und 1 bezeichnen. Ein einzelnes Byte hat daher 2 8 = 256 mögliche Werte.

Ich weiß eigentlich nicht, warum 8-Bit-Blöcke die typische Einheit sind. Ich kenne mich mit der Geschichte der Computerentwicklung nicht aus, um das zu wissen, aber ich kann Ihnen zumindest sagen, dass wir auf gängigen Systemen weiterhin 8-Bit-Bytes verwenden, weil wir uns an diesem Punkt irgendwie in diesem Bereich befinden und es keine gibt Grund zu ändern.

Da ich weiß, dass dies der Fall sein wird, werden Daten in der Realität nicht unbedingt in Ein-Byte-Blöcken oder einem Byte auf einmal gespeichert. Typische Festplatten verwenden häufig größere Blöcke usw. Für den Umfang Ihrer Frage ist dies jedoch ohne Bedeutung. Alles, was zählt, ist, dass es scheint, dass Festplatten mit einzelnen Bytes arbeiten. Die eigentliche Implementierung ist ein interessantes Thema, aber uns nicht hier beeinflussen: traditionell, Menschen im Allgemeinen Lagerung in Bezug auf die einzelnen Bytes diskutieren, und wir wahrscheinlich sind menschlich.

Binär, Hexadezimal

Der Grund, warum wir oft binäre Notation verwenden, wenn Werte über bitbezogene Dinge wie Bytes diskutiert werden, liegt einfach daran, dass dies am sinnvollsten ist. Da ein Bit zwei mögliche Werte hat, wird dies natürlich in eine binäre Darstellung von Zahlen übersetzt (binäre Bedeutung, jede Ziffer hat zwei mögliche Werte, im Gegensatz zum Dezimalsystem, das wir normalerweise jeden Tag verwenden, wobei jede Ziffer zehn mögliche Werte hat).

Der Grund, warum Programmierer auch gerne hexadezimal verwenden (jede Ziffer hat sechzehn mögliche Werte) ist, weil sie sehr praktisch ist . Es kommt einfach so vor, dass der durch eine einzige Hexadezimalziffer darstellbare Bereich genau dem durch vier Binärziffern darstellbaren Bereich entspricht. Und das passt gut in unsere 8-Bit-Bytes: Zwei Hex-Ziffern können jeden Wert eines Bytes darstellen. Es ist auch ein überschaubares System für unsere Gehirne. Es ist wirklich einfach, Hex auf Binär zu beziehen, sobald man sich daran gewöhnt hat.

Wir hätten ein Base-256-System beim Schreiben verwenden können, aber das wäre unpraktisch, da es schwer ist, 256 leicht zu schreibende, sprechbare und speicherbare Zeichen zu finden. Wir hätten ein Base-17-System verwenden können, aber das entspricht nicht so genau einer 8-stelligen Binärzahl. Also verwenden wir hexadezimal, weil es für uns eine Menge Sinn macht.

Text

Wir verwenden viel Text, daher ist es zu unserem Vorteil, mit Standardmethoden zu beginnen, um die Zeichen, die wir täglich verwenden, als Byteserie darzustellen. Diese Zuordnung von Zeichen zu Bytes wird als "Zeichenkodierung" oder "Zeichensatz" bezeichnet. Natürlich ist es uns unangenehm, Dinge zu vereinbaren, und viele verschiedene solcher Mappings wurden unabhängig voneinander für viele verschiedene Anforderungen entwickelt. Daher haben wir viele Zeichensätze, wie ASCII, ISO-8859-1 oder JIS .

Nebenbei wurde Unicode erfunden, um zu versuchen, einen Standard zu definieren, der alle glücklich machte und alle unsere verschiedenen Zeichencodierungen vereint, daher der Name "Unicode".

Der Punkt ist jedoch, dass der Text durch eine Reihe von Bytes dargestellt wird, und genau das, was jede Folge von Bytes bedeutet, wird durch verschiedene Zeichenkodierungen bestimmt, und die Tatsache, dass die Bytes überhaupt Text darstellen, beruht auf der Annahme, dass das Programm, das die Bytes liest, dies versteht Sie sollen Text darstellen. ASCII ist eine bequeme Sache, über die man sprechen kann, da jedes Zeichen genau ein Byte belegt, und es ist wirklich alt, wirklich einfach, wurde sehr häufig verwendet und ist, obwohl es für die Weltgemeinschaft äußerst unzureichend ist, immer noch sehr beliebt und leicht zu diskutieren.

Semantik

Ich bin überzeugt, dass dies für viele Menschen der verwirrendste Punkt ist.

Bytes sind nur Bytes. Sie haben im Wesentlichen beliebige Werte. Was diese Werte tatsächlich bedeuten, wird nur durch den Kontext bestimmt und davon, was ein Programm, das sie liest, tatsächlich mit ihnen macht.

Wenn Sie sich beispielsweise daran erinnern, dass ein Byte 256 Werte annehmen kann, kann der Wert 97 (binär 01100001, hexadezimal 61) am Ende des Tages viele verschiedene Dinge bedeuten :

  • Wenn das Byte als ganzzahliger Wert behandelt wird, ist dies die Zahl 97.
  • Wenn das Byte als ASCII-Zeichen behandelt wird, handelt es sich um den Buchstaben a.
  • Wenn das Byte als eine Computeranweisung für Intel x86-kompatible Prozessoren behandelt wird, handelt es sich um die Anweisung POPAoder POPAD(es spielt keine Rolle, wenn Sie nicht wissen, was diese sind, das ist nicht der Punkt).
  • Wenn das Byte ein Pixel in einem Graustufenbild darstellt, ist es wahrscheinlich diese Graustufe .
  • Wenn das Byte Teil einiger Kartendaten für ein Spiel ist, ist es vielleicht ein Baum oder ein Zaun oder etwas anderes.
  • Usw.

Auch für numerische Werte können die Bitmuster unterschiedliche Bedeutungen haben, zum Beispiel:

  • Manchmal sind wir mit den Werten 0-255 zufrieden. Andere Zeiten möchten wir mit negativen Zahlen umgehen, also verschieben wir den Bereich der semantischen Werte auf -128 bis 127 und verwenden das erste Bit, um anzuzeigen, ob es negativ ist oder nicht. Oder Wasauchimmer. Der Himmel ist die Grenze (obwohl, ähnlich wie bei der Zeichencodierung, auch ein Standardregelwerk für ganzzahlige Werte gilt).
  • Aufgrund verschiedener Umstände kodieren wir manchmal sogar ganzzahlige Werte, z . B. BCD .
  • Manchmal müssen wir größere Ganzzahlen darstellen. Wir verwenden also viele Bytes. Sogar das hat Optionen, siehe "endianness" .
  • Manchmal müssen wir Dezimalzahlen darstellen. Viele Optionen auch hier, siehe Optionen für Fließkomma und Festpunkte .

Der Punkt von all dem ist ein Byte ist nur ein Byte, es bedeutet nichts, bis Sie Kontext haben. Wenn ein Programm einige Bytes mit einer beabsichtigten Bedeutung schreibt, kann nur ein Programm, das sie liest und interpretiert, dass sie dieselbe Bedeutung haben, einen richtigen Sinn für sie finden.

Dies alles zusammenfügen

Nun, das alles auf Ihre Antwort zurückführen, sollte dies eigentlich ganz einfach sein:

  • Ihr Freund bezieht sich auf die Idee, dass Sie eine Zahl als Textdarstellung ihres Werts in Hexadezimalwert speichern . Der Wert 97 in Hex kann beispielsweise 61 sein. Dies ist eine zweistellige Zahl, die das Zeichen "6" gefolgt von "1" enthält. Als ASCII codiert, das wären zwei Bytes: der Wert 54, gefolgt von dem Wert 49 (Dezimalzahl). Dies hat jedoch nur dann eine Bedeutung, wenn Sie beim Lesen dieser Bytes zwei ASCII-codierte hexadezimale Ziffern verstehen.
  • Sie können auch einfach den Wert 97 speichern. Das ist nur ein Byte. Das ist die halbe Länge der vorherigen Option. Dies hat jedoch nur dann eine Bedeutung, wenn Sie es beim Rücklesen des Bytes so verstehen, dass es direkt einem Integerwert entspricht .

Normalerweise würden wir Programmierer die zweite Option wählen, aber es hängt wirklich vom Kontext ab. Zum Beispiel würden wir in einem HTML-Dokument, das für den Menschen lesbaren Text ist, immer noch ein Attribut wie speichern width="97". Sicher, es kann weniger Platz einnehmen, um hier eine engere Darstellung zu verwenden, aber dann wäre es mühsam, HTML zu schreiben. Es hängt also wirklich vom Kontext und Anwendungsfall ab.

Ich hoffe, zumindest etwas davon macht Sinn.

0
sawdust

Eine Zeichenkette mit sechs Dezimalzahlen kann als 3 Byte gespeichert werden

Das klingt nach BCD, binär codierter Dezimalzahl, Repräsentation und numerischen ASCII-Zeichen (ein vollständiges Byte pro Ziffer). Vier Bits werden zur Darstellung der Werte 0 bis 9 verwendet. (Die anderen sechs Werte sind undefiniert / ungültig.)
BCD-Werte können entpackt (eine BCD-Ziffer pro Byte) oder gepackt werden (zwei BCD-Ziffern pro Byte).

Die Vorteile der Verwendung von BCD im Vergleich zu binär sind bequeme Anzeige für den Benutzer (dh triviale Konvertierung) und kein Genauigkeitsverlust bei Dezimalbrüchen (z. B. ein Zehntel ist eine unendlich wiederholte Binärzahl).

Rechner verwenden normalerweise eine BCD-Darstellung anstelle einer binären. Die lange Ziffernfolge auf Kreditkarten und Sicherheits- / Zugriffskarten wird typischerweise als BCD-Zeichenfolge auf dem Magnetstreifen oder im übertragenen HF-Paket codiert.
Digitalcomputer verwenden normalerweise eine binäre Darstellung für Berechnungen und Speicherung. Eine CPU verfügt möglicherweise über Anweisungen zum Ausführen der BCD-Arithmetik.