Warum dieser binäre Vergleich in Python falsch?

Ich lese diesen Thread, aber ich bekomme den Binärvergleich nicht zu arbeiten

Code

#!/usr/bin/python import sys import os fp = open("/home/masi/r.raw", "rb") # I think you cannot do binary comparison with seek so read try: aBuf = bytes(fp.read(4)) while aBuf[:3] != b'\x58\x5E': aBuf = bytes(fp.read(4)) except: print "File end at position : ", fp.tell() finally: fp.close() 

Ausgabe in Debian Linux 8.1

 File end at position : 4 

Daten r.raw ist binär, wo erste Zeile in hex:

 48000000fe5a1eda480000000d00030001000000cd010000010000000000 

So dass die while-Schleife mindestens auf die Position 60 gehen sollte. Die Handhabung von binär mit b'\x..\x.. sollte richtig sein.

Warum ist der binäre Vergleich falsch?

One Solution collect form web for “Warum dieser binäre Vergleich in Python falsch?”

Zuerst verwendet Python 2 keine bytes() . Der Name bytes ist ein Alias ​​für str() . fp.read() gibt str Objekte zurück, die Bytes repräsentieren, und das b Präfix für ein String-Literal ist ein No-op, es ist nur für die Vorwärtskompatibilität mit Python 3.

Als nächstes vergleicht man ein Slice für 3 Zeichen mit einem 2 Byte String:

 >>> len('\x58\x5E') 2 >>> len('12345'[:3]) 3 

So wird der Vergleich nie falsch sein .

Wenn Sie die ersten 2 Bytes testen möchten, verwenden Sie stattdessen ein Slice für 2 Zeichen:

 while aBuf[:2] != '\x58\x5E': 

Oder verwenden Sie die str.startswith() -Methode:

 while not aBuf.startswith('\x58\x5E'): 

Das erklärt dein Problem natürlich nicht, denn du würdest erwarten, dass die ganze Datei gelesen wird.

Allerdings sind Sie wahrscheinlich immer ein IOError statt, aber Sie sind mit Pokemon Ausnahme Behandlung ; Sie fangen alle alle an. Verwenden Sie keine Decke except: Anweisung, Sie fangen alle möglichen Fehler einschließlich Speicherfehler.

Zumindest log deine Ausnahmen :

 try: aBuf = fp.read(4) while aBuf and not aBuf.startswith('\x58\x5E'): aBuf = fp.read(4) except Exception: print "File end at position : ", fp.tell() import traceback traceback.print_exc() 

Ich habe die Ausnahmen, die an die Exception Basisklasse gefangen werden, eingeschränkt, um zumindest keine Speicherfehler, Tastaturunterbrechungen und Generatorausgangsausnahmen zu fangen. Du bist wirklich scharf, dass weiter unten auf tatsächliche Ausnahmen, die Sie Ihren Code behandeln möchten (zB nicht alles ).

  • Liste vs Generator Verständnis Geschwindigkeit mit Join-Funktion
  • Wie zu beheben: "UnicodeDecodeError: 'ascii' Codec kann nicht decode Byte"
  • Return-Anweisung gibt nichts in Python-Rekursion zurück
  • Parallelisierung eines Wörterbuchverstehens
  • Python: Erstellen mehrerer Listen
  • Dropbox API Anfrage Token funktioniert nicht mit Python 3?
  • Pass-Klasse-Attribut als Parameter einer Funktion dieser Klasse in Python
  • Klick auf einen Link über Selen in Python
  • Python-Sammlungen.Counter: most_common Komplexität
  • Python: Wechselspiel zwischen lib / site-packages / site.py und lib / site.py
  • 2D Gaussian Fit für Intensitäten bei bestimmten Koordinaten in Python
  • Python ist die beste Programmiersprache der Welt.