int.from_bytes - Methode in Python2 - wie geht das?

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • In einem anderen Thread hab ich vorhin schon beschrieben, dass ich es derzeit nicht hinbekomme, rrdtool unter Python3 lauffähig zu bekommen. Nur unter Python2. Ich hoffe, da findet sich aber noch ein Weg.

    Falls sich das aber doch schwieriger gestaltet, muss ich wohl oder übel auf Python 2 zurückgreifen. Plan B, sozusagen =(
    Da wiederrum krieg ich es aber nicht wirklich gebacken, die entsprechende Methode aus dem Hut zu zaubern, die dasselbe macht, wie der Beispielcode unten.
    Im Grunde gehts nur darum, aus einem 32-Byte-Paket 8 Stück signed integer rauszufiltern.
    Unter Python3 ist mir das relativ schnell gelungen, sieht in einem Beispiel so aus:


    Zeile 2 bis 5 diente mir nur der Übersicht halber und zum Rumprobieren, was nach kurzer Zeit erfolgreich war.
    Die Ausgabe sieht wunschgemäß aus:

    Alles, was ich bisher so an Code in Python2 dazu finden konnte, sieht aus meiner Sicht vergleichsweise kompliziert und ungelenk aus. Deswegen die Frage: wie würde man zum Beispiel

    Code
    PL04 = int.from_bytes(zulu[12:16], byteorder="little", signed=True)


    am elegantesten in Python2 formulieren?

  • int.from_bytes - Methode in Python2 - wie geht das?? Schau mal ob du hier fündig wirst!

  • Versuch:

    Code
    def from_bytes_little_endian(bytes):
      pl = 0
      for i in range(len(bytes)):
        pl += bytes[i]*256**i
      return pl

    Geht sicher auch eleganter, sollte aber funktionieren.

    Einmal editiert, zuletzt von Manul (2. Januar 2017 um 22:44)

  • Danke zunächst!
    Habs mal so probiert...klappt leider nicht (bin aber nicht sicher, ob ich das überhaupt richtig umgesetzt hab).
    Kommt 189 raus, was ja falsch ist (sollte 3005 sein)):

    Code
    def from_bytes_little_endian(bytes):
    pl = 0
    for i in range(len(bytes)):
    pl += bytes[i]*256**i
    return pl
    
    
    bytes = [189,11,0,0]
    print(from_bytes_little_endian(bytes))
  • Kann ich nicht nachvollziehen:

    Code
    >>> def from_bytes_little_endian(bytes):
    ...   pl = 0
    ...   for i in range(len(bytes)):
    ...     pl += bytes[i]*256**i
    ...   return pl
    ... 
    >>> bytes = [189,11,0,0]
    >>> print(from_bytes_little_endian(bytes))
    3005
    >>>

    Den (inzwischen korrigierten) Tippfehler (p statt pl) hattest Du ja schon selbst entdeckt. Die Einrückungen in Deinem Beitrag stimmen allerdings nicht, kannst Du nochmal Deinen tatsächlichen Code zeigen?

    Einmal editiert, zuletzt von Manul (2. Januar 2017 um 22:48)

  • Ah...prima, das wars:
    beim return war die Einrückung bei mir eins zu weit. Nach Korrektur dann das korrekte Ergebnis!
    Ist schon ziemlich tricky, dieser Aspekt mit den korrekten Einrückungen bei Python, aber allmählich wirds ;)
    Jetzt müßt ich nur noch sehen, wir man die Vierer-Byte-Pakete aus dem Gesamtpaket rausschneidet.
    Da das mit dem rrdtool jetzt aber unter Python3 dank Deiner Hilfe zu laufen scheint, hat sich das hier (hoffentlich) erledigt.
    Grüße und danke!!
    N8

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!