Bitstrom aus Binärdaten umwandeln

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
arghargh
User
Beiträge: 81
Registriert: Donnerstag 4. September 2008, 22:26

Guten Tag,

ein String (rb) enthält einen "Datenstrom" der nicht byteorientiert ist.
Eine Informationseinheit enthält also N Bits, die ich gerne als Integer hätte, die aber stets an anderer Stelle auf 1-2 Bytes verteilt sind.

Beispiel:

FEDCBA98 76543210
00001111 11000000

-> 111111 = 63

In die Richtung geht struct.unpack() http://www.python.org/doc/lib/module-struct.html allerdings nur 8-Bit-weise.

1
Jetzt könnte man natürlich die Daten in einen ASCII-Binär-String umwandeln ("01010101000110") und dann immer N Zeichen einlesen und Rückwandeln, aber das ist nicht besonders effizient.

2
Vielleicht kann man in einer Schleife ein bis zwei Bytes von den Daten einlesen und dann bitweise mit einer Maske verknüpfen und durch Schieben die richtige Wertigkeit herstellen?

3
Gibt es eine x.read() Funktion, die statt Bytes mit 8 Bit auch Bytes mit N Bit einliest?

Mit erscheint Möglichkeit 2 brauchbar - was meint ihr?
arghargh
User
Beiträge: 81
Registriert: Donnerstag 4. September 2008, 22:26

Ah, das klingt gut:

http://pypi.python.org/pypi/bitarray/

Ich würde mich aber dennoch über Meinungen freuen.
BlackJack

Verschieben + Maske klingt gut.

Eventuell in einer Klasse gekapseln, die so einen ``read_bits(n)``-Aufruf implementiert, falls die Daten wirklich als Daten-/Bitstrom interpretiert werden sollen.

Falls es eher strukturierte Daten mit Bitfeldern sind, dann wäre ein Blick auf `construct` vielleicht eine gute Idee.
arghargh
User
Beiträge: 81
Registriert: Donnerstag 4. September 2008, 22:26

Schade:

>easy_install bitarray
Searching for bitarray
Reading http://pypi.python.org/simple/bitarray/
Best match: bitarray 0.2.3
Downloading http://pypi.python.org/packages/source/ ... 531e145f14
Processing bitarray-0.2.3.tar.gz
Running bitarray-0.2.3\setup.py -q bdist_egg --dist-dir c:\dokume~1\user\lokale~1\temp\easy_install-zqt9gr\bitarray-0.2.3\egg-di
st-tmp-e9hk8j
error: Setup script exited with error: Python was built with Visual Studio 2003;
extensions must be built with a compiler than can generate compatible binaries.
Visual Studio 2003 was not found on this system. If you have Cygwin installed,
you can try compiling with MingW32, by passing "-c mingw32" to setup.py.
arghargh
User
Beiträge: 81
Registriert: Donnerstag 4. September 2008, 22:26

Danke,

http://construct.wikispaces.com/

klingt auch sehr gut.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

arghargh hat geschrieben:Schade
Du hast keinen Compiler, du brauchst aber einen um es zu installieren. So einfach ist das.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Keinen passenden *C*-Compiler, um's zu präzisieren.
arghargh
User
Beiträge: 81
Registriert: Donnerstag 4. September 2008, 22:26

Habe sowohl cygwin als auch mingw installiert, vielleicht werden die Pfade nicht gefunden. Ist aber nicht so wichtig.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Ich mache das immer mit einer Batch-Datei:

Code: Alles auswählen

path=%path%;c:\programme\msys\1.0\mingw\bin
c:\programme\python24\python setup.py build --compiler=mingw32
Mingw bricht bei mir aber beim Kompilieren mit einer Fehlermeldung ab.
MfG
HWK
arghargh
User
Beiträge: 81
Registriert: Donnerstag 4. September 2008, 22:26

Ist doch wichtig, für Schiebeoperationen müssten die Daten nämlich erst in Integer gewandelt werden, da ist wieder der Salat mit der Bytegröße.

Nachdem ich einen Pfad gesetzt habe kommt leider das:

Code: Alles auswählen

C:\MinGW\bitarray-0.2.3>setup.py build -c mingw32
running build
running build_py
running build_ext
building 'bitarray._bitarray' extension
c:\MinGW\bin\gcc.exe -mno-cygwin -mdll -O -Wall -IC:\Programme\python\include -IC:\Programme\py
o build\temp.win32-2.5\Release\bitarray\_bitarray.o
bitarray/_bitarray.c:23: error: syntax error before "idx_t"
bitarray/_bitarray.c:23: warning: type defaults to `int' in declaration of `idx_t'
bitarray/_bitarray.c:23: warning: data definition has no type or storage class
bitarray/_bitarray.c:32: error: syntax error before "idx_t"
bitarray/_bitarray.c:32: warning: no semicolon at end of struct or union
bitarray/_bitarray.c:35: error: syntax error before '}' token
bitarray/_bitarray.c:35: warning: type defaults to `int' in declaration of `bitarrayobject'
...

bitarray/_bitarray.c:2109: error: `it' undeclared (first use in this function)
bitarray/_bitarray.c:2109: warning: implicit declaration of function `visit'
bitarray/_bitarray.c:2109: error: `arg' undeclared (first use in this function)
bitarray/_bitarray.c: At top level:
bitarray/_bitarray.c:2132: error: initializer element is not constant
bitarray/_bitarray.c:2132: error: (near initialization for `BitarrayIter_Type.tp_getattro')
bitarray/_bitarray.c:2141: error: initializer element is not constant
bitarray/_bitarray.c:2141: error: (near initialization for `BitarrayIter_Type.tp_iter')
bitarray/_bitarray.c: In function `bits2bytes':
bitarray/_bitarray.c:2151: error: syntax error before "n"
bitarray/_bitarray.c:2154: error: `n' undeclared (first use in this function)
error: command 'gcc' failed with exit status 1
Zuletzt geändert von arghargh am Sonntag 21. September 2008, 16:30, insgesamt 1-mal geändert.
arghargh
User
Beiträge: 81
Registriert: Donnerstag 4. September 2008, 22:26

Danke für den Hinweis - ist das derselbe Fehler? Dann liegt's ja nicht an mir ;-)
abgdf

Ohne genau zu verstehen, was mit diesen binären Daten los ist, glaube ich, daß es nicht allzu schwierig wäre, einen String in Python entsprechend umzuwandeln.

Oder wäre das zu langsam, so daß in jedem Fall C oder Assembler eingesetzt werden müßte ?

Gruß
arghargh
User
Beiträge: 81
Registriert: Donnerstag 4. September 2008, 22:26

Nein, eigentlich unkritisch - nur dass es als ASCII String etwa 100kB sind (Faktor 8). Ist nicht elegant.
arghargh
User
Beiträge: 81
Registriert: Donnerstag 4. September 2008, 22:26

MinGW von hier:
http://nuwen.net/mingw.html

Gibt einen Fehler,

Code: Alles auswählen

  File "C:\Programme\python\lib\distutils\version.py", line 107, in parse
    raise ValueError, "invalid version number '%s'" % vstring
ValueError: invalid version number '2.18.50.20080109'
Lösung hier:

http://boodebr.org/main/python/build-wi ... _DISTUTILS

Bringt es aber auch nicht.


PS: engl. Wikipedia Artikel:
http://en.wikipedia.org/wiki/Bit_array
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Alternativ kannst du auch den kostenlosen Microsoft-Compiler verwenden, der immer noch verfügbar ist, auch wenn die von dir verlinkte Seite es anders gehauptet,
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten