2 Stimmen

Bit-Endianness und Portabilität von C-Binärdateien

In C habe ich ein char-Array, das ich zum Speichern von Daten auf Bit-Ebene verwende. Ich speichere diese Arrays in Dateien und lese sie dann auf Maschinen mit unterschiedlichen Architekturen ein. Meine Frage ist, ob die Reihenfolge der Bits konsistent garantiert wird? Wenn ich zum Beispiel "10010011" im ersten Byte speichere, werden die benachbarten 1en immer als Positionen 2^0 und 2^1 gelesen, oder könnten sie als die Bits 2^7 und 2^6 interpretiert werden?

EDIT: Ich möchte diese Frage etwas klarstellen für Personen, die diese Seite später lesen. Byte-Reihenfolge bezieht sich auf die Reihenfolge der Bytes in einem Multi-Byte-Objekt, aber mein Anliegen betrifft die Bits in einem bestimmten Byte. Wenn ein Byte auf die Festplatte gespeichert wird, wird es als Sequenz von (in der Regel) 8 Bits gespeichert. Ich bin kein Hardware-Experte, aber es muss irgendwie darauf hinauslaufen. Also, mein Anliegen ist, ob die Art und Weise, wie das Byte gespeichert wird, so ist, dass jede Maschine den ursprünglichen unsigned char-Wert liest, oder ob das, was für eine Maschine 3 ist, für eine andere 192 ist. Ich befürchte, dass die Bits irgendwie durcheinander geraten könnten. Offensichtlich ist dies kein Anliegen, gemäß der Antwort, die ich ebenfalls ausgewählt habe, sowie eines der Kommentare unten. Danke.

1voto

user3629249 Punkte 15946

Die einfache Antwort:

Die Bits werden weiterhin in der richtigen Reihenfolge sein.

Allerdings, wenn eine Formatkonvertierung durchgeführt wird, die über %c hinausgeht, zum Beispiel %d, dann wird die Endianness der Lesearchitektur die Byte-Reihenfolge bestimmen. Die Bits innerhalb jedes Bytes werden jedoch gleich bleiben.

0voto

Mustafa Chelik Punkte 2113

Endianness betrifft die Reihenfolge der Bytes, nicht der Bits. So wird 00001101 in einer Little-Endian-Maschine das gleiche sein wie in einer Big-Endian-Maschine. Es gibt jedoch etwas, das du über die Reihenfolge der Bits in verschiedenen Maschinen wissen solltest. Die Reihenfolge der Bits ändert sich in Unionen. Wenn du Unionen verwenden möchtest, lies dies, um herauszufinden, wie die Endianness die Packung von Bitfeldern beeinflusst.

0voto

mctylr Punkte 5041

Das Konzept, nach dem Sie fragen möchten, wird als Bit-Nummerierung oder Bit-Endianness bezeichnet, und Systemarchitekturen werden als Least- oder Most-Significant-Bit (MSB, LSB) Reihenfolge bezeichnet.

Soweit ich weiß, bezieht sich der Bezug immer auf die 0-te oder erste Bit-Position.

In Bezug auf ein einziges 8-Bit-Byte oder Oktett wird es portabel sein, so dass der Wert des Bytes konsistent als 0x93 (147 Dezimal) betrachtet wird. Wenn Sie die Bit-Zeichenfolge als LSB-Repräsentation schreiben, wobei das 0-te Bit das rechteste Bit ist (die Norm für Little-Endian-Prozessoren), wie typischerweise von Benutzern von links nach rechts natürlichen Sprachen wie Englisch gemacht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X