Seite 1 von 1

Bitstrom aus Binärdaten umwandeln

Verfasst: Mittwoch 17. September 2008, 11:55
von arghargh
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?

Verfasst: Mittwoch 17. September 2008, 12:06
von arghargh
Ah, das klingt gut:

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

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

Verfasst: Mittwoch 17. September 2008, 12:35
von 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.

Verfasst: Mittwoch 17. September 2008, 12:37
von arghargh
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.

Verfasst: Mittwoch 17. September 2008, 12:40
von arghargh
Danke,

http://construct.wikispaces.com/

klingt auch sehr gut.

Verfasst: Mittwoch 17. September 2008, 14:10
von Leonidas
arghargh hat geschrieben:Schade
Du hast keinen Compiler, du brauchst aber einen um es zu installieren. So einfach ist das.

Verfasst: Mittwoch 17. September 2008, 14:20
von BlackJack
Keinen passenden *C*-Compiler, um's zu präzisieren.

Verfasst: Sonntag 21. September 2008, 14:49
von arghargh
Habe sowohl cygwin als auch mingw installiert, vielleicht werden die Pfade nicht gefunden. Ist aber nicht so wichtig.

Verfasst: Sonntag 21. September 2008, 15:15
von HWK
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

Verfasst: Sonntag 21. September 2008, 15:23
von arghargh
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

Verfasst: Sonntag 21. September 2008, 15:24
von arghargh
Danke für den Hinweis - ist das derselbe Fehler? Dann liegt's ja nicht an mir ;-)

Verfasst: Sonntag 21. September 2008, 17:13
von 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ß

Verfasst: Sonntag 21. September 2008, 17:54
von arghargh
Nein, eigentlich unkritisch - nur dass es als ASCII String etwa 100kB sind (Faktor 8). Ist nicht elegant.

Verfasst: Sonntag 21. September 2008, 21:31
von arghargh
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

Verfasst: Montag 22. September 2008, 12:11
von Leonidas
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,