Forum: PC-Programmierung Python wandlung von Bit stream in int (array)


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von nurmal so (Gast)


Lesenswert?

Hallo,

ich habe hier gerade eine kleine Aufgabe die ich zur Abwechslung mal mit 
Python umsetzen würde. Weil ich mich schon länger damit beschäftigen 
wollte und sich nun die Gelegenheit ergibt.

Ich habe bisher 0 Erfahrung damit, bisher hab ich viel in C gemacht, 
aber mit Scriptsprachen wenig Berührungspunkte.

Nun zu meinem Problem, ich habe ein großes Excel Dokument, in dem in 
einer Spalte immer ein Binärwert (0 oder 1) steht. Ich würde diese werte 
nun gerne möglichst platzsparend auf einen µC bringen. z.B. in Form 
eines uin16_t array[]. Zu diesem Zweck müsste ich nun die (variable) 
Anzahl der Daten in ein entsprechendes Format bringen.
Bsp. aus (eigentlich Untereinander)(00010001001000100011001101000100) 
soll dann so etwas wie
1
uint16_t array[]=
2
{ 0x2211, 0x4433, 
3
};

werden.


Mein Ansatz dazu wäre
1) Die Datei öffnen, ideal wäre direkt die excel datei
ich kann die aber auch vorher in ein anderes Format konvertieren, oder 
auch schon in excel diverse Anpassungen machen.

2) die eigentliche Wandlung
2.1) erst irgendwie in 16er Schritte zerlegen und jeweils in Value 
ablegen
2.2) den Wert Value mittels int('Value', 2) (?) in einen Integer wandeln
2.3) mittels ? in einen hex Wert wandeln
2.4) diesen Hexwert zu einem String hinzufügen

3) Ausgabe, entweder als txt oder in die Zwischenablage

Das beschriebene verfahren ist jedoch ziemlicher c style, jetzt wüste 
ich gerne wie das ganze vieleicht viel einfacher in Python realisiert 
werden kann.

Schon mal vielen Dank für eure Ideen und Denkanstöße

von imonbln (Gast)


Lesenswert?

Mein Lösungsansatz 32 Bits zu einem String zusammen fassen und dann 
ungefähr so:
1
import struct
2
3
int32 = int("00010001001000100011001101000100", 2)
4
left, right = struct.unpack(">HH", int32.to_bytes(4, "big"))
5
6
print(hex(left), hex(right))

von Sascha W. (sascha-w)


Lesenswert?

Also das könntest du mit VBA auch gleich in Excel machen, dann hast du 
auch ne Scriptsprache gelernt. Oder ja nach Anzahl der Zeilen auch mit 
mehreren Formeln (wird aber sperrig).
Die Exceldatei mit Python direkt einlesen würde ich mir aber nicht antun 
wollen, zumal es da ja auch einigen Versionen an xl-Dateiformaten gibt. 
Es sein denn jemand hat dafür schon ein Modul entwickelt das man 
installieren könnte.

Sascha

von Karl (Gast)


Lesenswert?

VBA wäre sicher einfacher.
Für Python würde ich statt Excel ein (richtiges) csv einlesen und das 
ganze irgendwie in 5 Zeilen mit Numpy erledigen. Dann passt auch die 
Performance bei grossen Dateien.

von Karl (Gast)


Lesenswert?

nurmal so schrieb:
> Mein Ansatz dazu wäre
> 1) Die Datei öffnen, ideal wäre direkt die excel datei
> ich kann die aber auch vorher in ein anderes Format konvertieren, oder
> auch schon in excel diverse Anpassungen machen.
>
> 2) die eigentliche Wandlung
> 2.1) erst irgendwie in 16er Schritte zerlegen und jeweils in Value
> ablegen
> 2.2) den Wert Value mittels int('Value', 2) (?) in einen Integer wandeln
> 2.3) mittels ? in einen hex Wert wandeln
> 2.4) diesen Hexwert zu einem String hinzufügen
>
> 3) Ausgabe, entweder als txt oder in die Zwischenablage
1
import csv
2
out = ''
3
with open('Ecxel.txt') as csv_file:
4
    csv_reader = csv.reader(csv_file, delimiter=',')
5
    count = 0
6
    tmp = ''
7
    for row in csv_reader:
8
            count += 1
9
            tpm += row
10
            if count == 16:
11
                out += hex(int(tpm,2)
12
                tpm = ''
13
                count = 0
14
 # out speichern oder

von Karl (Gast)


Lesenswert?

P.S.:
Was du mit den "Restbits" machen willst musst du dir noch überlegen.

von nurmal so (Gast)


Lesenswert?

oh
erst mal vielen Dank an alle Kommentatoren!
als csv speichern hatte ich eh schon gedacht.

Und vielen Dank für den Code Karl, ich werde damit starten.

von 900ss (900ss)


Lesenswert?

python kann mit entsprechendem Import direkt Excel lesen. Hab ich schon 
genutzt aber leider gerade den Namen der importierten Library im Kopf.

von Nur_ein_typ (Gast)


Lesenswert?

900ss D. schrieb:
> python kann mit entsprechendem Import direkt Excel lesen. Hab ich
> schon
> genutzt aber leider gerade den Namen der importierten Library im Kopf.

Pandas, zum Beispiel.

von Pankaj J. (pankaj_j)


Lesenswert?

Hier, wie Sie es tun
1
>>> aus Bitstring Import BitArray
2
>>> b = BitArray(bin='11111111')
3
>>> b.uint
4
255
Danke!

: Bearbeitet durch User
von Tek (Gast)


Lesenswert?

Wenn Du die Datei als xlsx abspeichern kannst würde ich 
https://openpyxl.readthedocs.io/ nehmen um die Daten auszulesen. Hab 
damit gute Erfahrungen gemacht gerade wenn es mehrere Tabellenblätter 
gibt ist ein umwandeln in csv recht mühsam.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.