2010-04-14 10 views
6

Ich lese eine Datei byteweise.Bit-Reihenfolge und Endianess

Sagen Sie zum Beispiel, ich habe dieses Byte: 0x41 (0100 0001) in Hex dargestellt.

Nun möchte ich die ersten drei Bits dieses Bytes, d. H. (010).

Ich kann bitweise Logik verwenden, um die ersten drei Bits zu extrahieren, aber meine Frage ist, ob die ersten drei Bits unabhängig von der Endianität der Maschine sind (d. H. Sie können nicht 001 sein)?

Danke,

+0

Bits werden normalerweise von rechts gezählt, also wäre 010 die letzten drei Bits in Ihrem Beispiel. Ich erwähne das, weil ich glaube, dass die meisten Dokumente zur Bitmanipulation die niedrigsten Bits - die Bits, die 1, 2, 4, ... darstellen - als die ersten Bits betrachten. –

+0

Es gibt keine universelle Konvention für die Bit-Reihenfolge in einem Wort. In der Praxis hängt es davon ab, wofür Sie es verwenden. Wenn Sie mit Mehrwortarithmetik arbeiten, ist die natürliche Reihenfolge LSB-first. Für die Berechnung eines CRC für ein TCP/IP-Paket macht MSB-first jedoch mehr Sinn. – comingstorm

Antwort

7

Eine andere Möglichkeit, dies zu denken, dass endianness gilt nur, wenn Sie die Komponenten eines Elements einzeln lesen kann - da Sie in der Regel unabhängig die einzelnen Bytes eines 32-Bit-int aus dem Speicher lesen können, wenn Sie diejenigen interpretieren wollen Bytes als 32-Bit-Int müssen Sie sicherstellen, dass die Endlichkeit der Architektur berücksichtigt wird.

Normalerweise können Sie nicht die einzelnen Bits eines Bytes aus dem Speicher lesen, also gibt es wirklich kein Konzept von 'bit endianness' was die Speicherarchitektur angeht (ich bin mir sicher, dass es auf der Hardwareebene ist, aber nicht etwas, was Sie auf der Softwareebene sehen können). Einige Bereiche, in denen Sie benötigen, zu behandeln (oder zumindest sich bewusst sein) Bit endianness:

  1. die Reihenfolge, in der Compiler speichert Bits eines Bit-Feld ist Compiler abhängig (und nicht notwendigerweise auf die im Zusammenhang Endlichkeit der Hardwareplattform - verschiedene Compiler können Bitfelder für die gleiche Plattform anders anordnen - es ist möglich, dass ein Compiler über Befehlszeilenoptionen in der einen oder anderen Weise konfiguriert werden kann, ähnlich wie char als signiert oder unsigniert gesetzt werden kann) . C-Bit-Felder haben jedoch mit der Hardwareadressierung wirklich nichts zu tun.

  2. einige Hardwarearchitekturen erlauben es Ihnen, einzelne Bits zu adressieren (zum Beispiel den ARM Cortex M3), also müssten Sie in diesem Fall wissen, wie die Architektur für Bit adressiert ist, wenn Sie diese Funktion verwenden .

  3. Wenn Sie Bits über eine serielle Verbindung senden, gibt die Hardwareschnittstelle normalerweise an, ob das höchstwertige Bit oder das am wenigsten signifikante Bit zuerst auf der Leitung "verschoben" wird.

7

Endianness nur auf Byte-Reihenfolge gilt, Bit nicht um. Die Reihenfolge der Bits ist innerhalb des entsprechenden Bytes gleich.

3

Ja, sie werden gleich sein.

Bit-Reihenfolge innerhalb von Bytes ist im Allgemeinen nur ein Problem, wenn Sie Bit-für-Bit-E/A zum Beispiel beim Lesen eines Datenstroms ausführen, der über eine serielle Leitung gesendet wird. Diese senden wirklich ein einzelnes Bit auf einmal, so dass Sender und Empfänger übereinstimmen müssen, wenn Bits für jedes Byte von links nach rechts oder von rechts nach links gesendet werden.

Bei Dateien und In-Memory-Zugriffen ändert sich die Bit-Reihenfolge innerhalb von Bytes nicht.

1

Ein bisschen verwirrend :-). Außer in der seriellen Kommunikation hat der Begriff "erstes Bit" keine Bedeutung, es gibt nur die am weitesten links liegenden (höchstwertigsten) und am weitesten rechts liegenden (am wenigsten signifikanten) Bits. Wenn dir jemand sagt, du sollst die "ersten drei Bits" herausziehen, dann gib ihnen einen Klaps und frage, was sie bedeuten. Selbst der Ausdruck "Bit 0" ist mehrdeutig, er bedeutet oft das am wenigsten signifikante, am weitesten rechts liegende Bit (das 2 ** 0-Bit), wird aber fast so oft verwendet, um das höchstwertige, am weitesten links liegende Bit in einem Bitfeld zu bezeichnen .Welches Bit das "erste" Bit in einem Byte ist, hängt ganz davon ab, was Sie mit den Bits machen.

1

Die bitweisen Operatoren in C sind so definiert, dass sie unter Werte arbeiten. Der Ausdruck 0x41U >> 5 gibt immer den Wert 2 (binär, 010).

0

Bit-Reihenfolge spielt eine Rolle, wenn ein Feld einen Teil eines Bytes verwendet oder Bytes beginnend oder endend (oder beides) in einem Byte aufteilt.

Beispiel: 2 Bytes Daten zuerst 235 (Dezimal) Sekunde 173 (Dezimal), aka Hex EB und AD.

Ich möchte ein Bit-Feld beginnend mit dem vierten Bit durch das 12. Bit. Also, überspringe 3 Bits, mache aus den nächsten 9 Bits eine 9-Bit-Ganzzahl ohne Vorzeichen.

Ich beanspruche gibt es 4 mögliche Ergebnisse:

 
    byteOrder, bitOrder 

* bigEndian, bigEndian results in hex 0BA or decimal 186 
* littleEndian, littleEndian results in hex 1BD or decimal 445 
* littleEndian, bigEndian results in hex 05D or decimal 93 
* bigEndian, littleEndian results in hex 1DE or decimal 478 

I die ersten 3 diese Daten in 4 gesehen. groß, groß und klein, kleine sind leicht auszuarbeiten.

Hinweis zum Umgang damit.

Wenn die Byte-Reihenfolge Big Endian ist, notieren Sie die Bytes von links nach rechts aufsteigend. Wenn die Byte-Reihenfolge Little Endian ist, notieren Sie die Bytes von rechts nach links.