Frage

Ich arbeite an einem Programm, wo ich einige Daten in einer ganzen Zahl speichern und bitweise verarbeiten. Zum Beispiel könnte ich die Nummer 48 erhalten, die ich Bit-für-Bit verarbeiten werde. Im Allgemeinen hängt die endianness von ganzen Zahlen auf der Maschine Darstellung von ganzen Zahlen, aber nicht Python alles tun, um sicherzustellen, dass die Ints immer Little-Endian sein werden? Oder muss ich überprüfen endianness wie würde ich in C und dann separaten Code schreiben, für die beiden Fälle?

Ich frage, weil mein Code auf einer Maschine Sun läuft und, obwohl das man es auf jetzt läuft Intel-Prozessoren verwendet, könnte ich mit Sun-Prozessoren in Zukunft auf eine Maschine wechseln, die ich weiß, ist Big-Endian.

War es hilfreich?

Lösung

Pythons int hat die gleiche endianness wie der Prozessor es läuft. Die struct Modul können Sie Byte Blobs Ints (und umgekehrt, und einige andere Datentypen umwandeln auch) in entweder nativ, little-endian oder big-endian-Möglichkeiten, abhängig von der Format-String wählen: starten Sie das Format mit @ oder keine endianness Zeichen verwenden nativen endianness (und einheimische Größen - alles andere verwendet Standard-Größen), '~' für native, '<' für little-endian " >‘oder '!' für Big-Endian.

Dies ist Byte-für-Byte, nicht Bit-für-Bit; nicht sicher, was Sie genau durch Bit-für-Bit-Verarbeitung in diesem Zusammenhang bedeuten, aber ich nehme an, es in ähnlicher Weise untergebracht werden kann.

Für die schnelle "bulk" Verarbeitung in einfachen Fällen beachten Sie auch die Array Modul - - die fromstring und tostring Methoden können auf große Anzahl von Bytes schnell arbeiten, und die byteswap Methode können Ihnen den „anderen“ Endian (native zu nicht-native oder umgekehrt), wieder schnell und für eine große Anzahl von Elementen (die gesamten bekommen Array).

Andere Tipps

Wenn Sie Ihre Daten ‚bitweise‘ verarbeiten, dann die bitstring Modul Macht sein von Hilfe für Sie. Es kann auch mit endianness zwischen Plattformen (auf dem neuesten Stamm baut zumindest - in den nächsten Tagen veröffentlicht werden) beschäftigen.

Der struct Modul ist die beste Standard-Methode mit endianness zwischen Plattformen umzugehen. Zum Beispiel dieser Pack und entpacken Sie die ganzen Zahlen 1, 2, 3 in zwei 'Shorts' und ein 'long' (2 und 4 Bytes auf den meisten Plattformen) mit nativen endianness:

>>> from struct import *
>>> pack('hhl', 1, 2, 3)
'\x00\x01\x00\x02\x00\x00\x00\x03'
>>> unpack('hhl', '\x00\x01\x00\x02\x00\x00\x00\x03')
(1, 2, 3)

die endianness der Plattform Um zu überprüfen, programmatisch können Sie

>>> import sys
>>> sys.byteorder

, die entweder "big" oder "little" zurückkehren wird.

Überprüfen Sie, wenn?

Wenn bitweise Operationen zu tun, wird der int in die gleiche Endianess hat wie die Ints Sie in. Sie brauchen nicht, dass zu überprüfen. Sie müssen nur darüber sorgen, wenn zu / von Byte-Sequenzen, in beiden Sprachen konvertieren, afaik.

In Python Sie die Struktur-Modul für diesen, am häufigsten struct.pack () und struct.unpack ().

Das folgende Snippet wird Ihnen sagen, ob Ihr System Standard-Little-Endian ist (sonst ist es Big-Endian)

import struct
little_endian = (struct.unpack('<I', struct.pack('=I', 1))[0] == 1)

Beachten Sie jedoch, dies wird nicht das Verhalten von Bit-Operatoren beeinflussen: 1<<1 gleich ist, unabhängig von dem Standard-Endian Ihres System 2

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top