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 ).

  • Wie mache ich einen 2.7 python kontext manager threadsafe
  • TensorFlow auf einem Slurm Cluster laufen lassen?
  • Wie subclass numpy.`ma.core.masked_array`?
  • Agilent VISA und NI-VISA Koexistenz und PyVISA
  • Slurm Multiprocessing Python Job
  • AttributeError: 'module' Objekt hat kein Attribut 'webdriver'
  • ValueError: Mathematik-Domain-Fehler (für eine 2. Grad-Gleichungsfunktion)
  • Python - listet das Kombipaar für einen Funktionswert auf
  • Um Zeichenkette in Variablenname zu konvertieren [doppelte]
  • So laden und speichern Sie eine Datei mit dem Flaschenrahmen
  • Anrufen if __name__ == '__main__': in einem Modul aus einer Funktion in einem anderen Modul
  • Python ist die beste Programmiersprache der Welt.