Forum: PC-Programmierung Python und die modernen Daten?!


von Sven (Gast)


Lesenswert?

Ich bin nicht fitt im programmieren.
Jetzt möchte ich eine Variable in Python anzeigen und habe ein print 
eingebaut. Leider ist die Ausgabe jetzt
b'\x00\x00U\xaa\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\xac\x00\x00\ 
x00\x00\xd0\x97fgo3i\xeb\x10\xb5\....

Das passt leider nicht so in meine Welt weil ich lebe in 8bit. Mit Hex 
könnte ich leben aber was soll \x97fgo3i\ sein.
Die Daten sind klassische 8 Bit Bytes die nacheinander seriell im Python 
ankommen.

Kann mir jemand sagen wie man dieses merkwürdige format nennt und wie 
man daraus 8bit asc bin oder hex machen kann?

von Norbert (Gast)


Lesenswert?

Sven schrieb:
> Ich bin nicht fitt im programmieren.
> Jetzt möchte ich eine Variable in Python anzeigen und habe ein print
> eingebaut. Leider ist die Ausgabe jetzt
> b'\x00\x00U\xaa\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\xac\x00\x00\
> x00\x00\xd0\x97fgo3i\xeb\x10\xb5\....
>
> Das passt leider nicht so in meine Welt weil ich lebe in 8bit. Mit Hex
> könnte ich leben aber was soll \x97fgo3i\ sein.
> Die Daten sind klassische 8 Bit Bytes die nacheinander seriell im Python
> ankommen.
>
> Kann mir jemand sagen wie man dieses merkwürdige format nennt und wie
> man daraus 8bit asc bin oder hex machen kann?

Möglicherweise versuchst du ein bytearray auszugeben.  Du solltest 
dringend ein Python Buch lesen.
In diesen Fall würde ein:
1
#!/usr/bin/python3
2
# -*- coding: UTF-8 -*-
3
4
ba = bytearray((1,2,3,4,5))
5
6
for item in ba:
7
    print(f'{item:02x} ', end='')
8
# 01 02 03 04 05
helfen.

von Christoph db1uq K. (christoph_kessler)


Angehängte Dateien:

Lesenswert?

>dringend ein Python Buch lesen
das habe ich vor ein paar Jahren genau zu dem Thema getan, hier meine 
Aufzeichnung dazu. Leider nur als Bild.

von vnnn (Gast)


Lesenswert?

1
bytes = (
2
    b'\x00\x00U\xaa\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\xac'
3
    b'\x00\x00\x00\x00\xd0\x97fgo3i\xeb\x10\xb5'
4
)
5
print('ugly:')
6
print(bytes)
7
print('less ugly:')
8
print(bytes.hex())
führt zu
1
bytes = (
2
    b'\x00\x00U\xaa\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\xac'
3
    b'\x00\x00\x00\x00\xd0\x97fgo3i\xeb\x10\xb5'
4
)
5
print('ugly:')
6
print(bytes)
7
print('less ugly:')
8
print(bytes.hex())

Ist übrigens auch der erste Google-Treffer bei der Suche nach "python 
print bytes as hex".

von vnnn (Gast)


Lesenswert?

vnnn schrieb:
> führt zubytes = (
>     b'\x00\x00U\xaa\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\xac'
>     b'\x00\x00\x00\x00\xd0\x97fgo3i\xeb\x10\xb5'
> )
> print('ugly:')
> print(bytes)
> print('less ugly:')
> print(bytes.hex())

Natürlich ist die Ausgabe tatsächlich
1
ugly:
2
b'\x00\x00U\xaa\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\xac\x00\x00\x00\x00\xd0\x97fgo3i\xeb\x10\xb5'
3
prettier:
4
000055aa0000000000000013000000ac00000000d09766676f3369eb10b5

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Sven schrieb:
> Ich bin nicht fitt im programmieren.
> Jetzt möchte ich eine Variable in Python anzeigen und habe ein print
> eingebaut. Leider ist die Ausgabe jetzt

>
> was soll \x97fgo3i\ sein.

"\x97"
"f"
"g"
"o"
"3"
"i"

> Die Daten sind klassische 8 Bit Bytes die nacheinander seriell im Python
> ankommen.
>
> wie man daraus 8bit asc [...] machen kann?

Falls die Bytes in UTF-8 codiert sind:

b'\x00...'.decode("utf-8")

was aber zu einem Fehler führt, d.h. die Daten sind nicht in UTF-8. 
Wenn du es als List haben willst:
1
print (list(l for l in b'\x00\x00U\xaa\x00\x00...'))
2
[0, 0, 85, 170, 0, 0, ...]

d.h. man kann auf die Bytes zugreifen wie auf ein Array / Liste, aber 
dann werden natürlich keine multi-Byte Zeichen erkannt.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Mein Text war Teil eines Wikiartikels, als PDF gedruckt. Ich habe ihn 
hier in der Sandbox nochmal so ähnlich eingegeben:
https://www.mikrocontroller.net/articles/Testseite#Python-Bytearray_umwandeln

von Norbert (Gast)


Lesenswert?

Sven schrieb:
> b'\x00\x00U\xaa\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\xac\x00\x00\
> x00\x00\xd0\x97fgo3i\xeb\x10\xb5\....

Das IST bereits ein bytearray, da muss man nicht extra eine Liste daraus 
bauen.
Man kann die Variable in der das Zeug steht entweder wie ein 
C-Programmierer byte für byte über var[index] ansprechen,
1
#!python
2
for index in range(len(var)):
3
   # var[index] Werte von 0x00…0xff

oder über:
1
#!python
2
for byte_item in var:
3
   # byte_item Werte von 0x00…0xff

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Ich hatte damals einen DDS am Raspi angesteuert , die gewünschte 
Frequenz berechnet, und musste es nur noch über den SPI-Bus ausgeben.

ich zitiere mich mal:
Allen ist gemeinsam, dass die Ausgabe des Byte-Arrays auf dem Bildschirm 
Buchstabensuppe ergibt. Python gibt alle Bytes, die einem druckbaren 
Ascii-Zeichen entsprechen als dieses Zeichen aus, nicht druckbare werden 
dagegen als zweistellige Hexadezimalzahl mit vorgestelltem \x gezeigt.

...\x97fgo3i... ist genau diese Buchstabensuppe.

: Bearbeitet durch User
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.