Schei� encoding

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Jetzt hab ich eine Klasse draus gemacht, und jetzt spinnt python mit den modulen rum, erst will es ein modul in einen unterordner nicht mehr finden trotz __init__.py geht blos mit sys.path.append('modules'). aber jetzt kommt immer noch das:
AttributeError: 'module' object has no attribute 'BitStream'
Aber bitstring hat doch eine Klasse BitStream und ich hab mal help(bitstring) ausgeben lassen und da steht auch eine klasse BitStream drinnen, und der Code ging vorher auch noch, wieso kommt da jetzt diese Komische Fehler?
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
BlackJack

@Py-Prog: Solange Du nicht zeigst was Du genau machst und die genaue Fehlermeldung, kann man da nicht viel zu sagen. Lass Dir direkt nach dem Import doch mal das Modul per ``print`` ausgeben. Wenn ich mal wild raten sollte hast Du einem Modul den Namen `bitstring` verpasst. Oder hast zumindest ein anderes als das eigentliche im Pfad durch Deine `sys.path`-Aktion.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Der Code:

Code: Alles auswählen

import bitstring
import packet_structs

class minecraft_parser(object):
    def __init__(self, socket_obj, from_to):
        self.socket_obj = socket_obj
        self.from_to = from_to
        self.reset_vars()

    def reset_vars(self):
        self.packet_content = bytes()
        self.parsed_packet_content = []

    def __read(self, len_):
        recv_packet = bytes()
        while len_ != len(recv_packet):
            recv_packet += self.socket_obj.recv(len_-len(recv_packet))
        self.packet_content += recv_packet
        return recv_packet

    def __parse_string(self):
        len_ = bitstring.BitStream(self.__read(2)).read('uint:16')*2
        return bitstring.BitStream(self.__read(len_)).read('bytes:' + str(len_)).decode('utf-16be')

    def __parse_byte_or_bool(self, var_type):
        return bitstring.BitStream(self.__read(1)).read(var_type)

    def __parse_int_float(self, var_type):
        return bitstring.BitStream(self.__read(int(int(var_type.split(':')[1])//8))).read(var_type)

    def __parse_metadata(self):
        metadata = {}
        x = self.__read(1)
        while x != 127:
            index = x & 0x1F # Lower 5 bits
            ty    = x >> 5   # Upper 3 bits
            if ty == 0: val = self.__read(1) 
            if ty == 1: val = self.__parse_int_float('int:16') 
            if ty == 2: val = self.__parse_int_float('int:32') 
            if ty == 3: val = self.__parse_int_float('float:32') 
            if ty == 4: val = self.__parse_string()
            if ty == 5:
                val = {}
                val["id"]     = self.__parse_int_float('int:16')
                val["count"]  = self.__read(1)
                val["damage"] = self.__parse_int_float('int:16')
            if ty == 6:
                val = []
                for i in range(3):
                    val.append(self.__parse_int_float('int:32'))
            metadata[index] = (ty, val)
            x = self.__read(1)
        return metadata

    def parse_packet(self):
        self.reset_vars()
        packet_type = self.__read(1)
        print('======', packet_type)
        if type(packet_structs.structs[packet_type]) == tuple:
            packet_struct = packet_structs.structs[packet_type]
        else:
            packet_struct = packet_structs.structs[packet_type][self.from_to]

        print(packet_struct)
        
        for var_type in packet_struct:
            if type(var_type) == tuple:
                var_type = var_type[0]

            if var_type == 'string16':
                self.parsed_packet_content.append(self.__parse_string())
            elif var_type in ['bytes', 'bool']:
                self.parsed_packet_content.append(self.__parse_byte_or_bool(var_type))
            elif var_type.split(':')[0] in ['int', 'float']:
                self.parsed_packet_content.append(self.__parse_int_float(var_type))
            elif var_type == 'metadata':
                self.parsed_packet_content.append(self.__parse_metadata())
            else:
                print('UNKNOWN type:', var_type)
        return [self.parsed_packet_content, self.packet_content]
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
BlackJack

Und wie sieht die Ausgabe von ``print bitstring`` nach dem ``import`` aus? Und wie die Fehlermeldung?
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Ich wollte gard die Print ausgabe und den Traceback schicken da ist mir aufgefallen das die printausgabe das ausgiebt: \bitstring\__init__.py und die __init__.py ist ja auch leer ...
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

So fertig, jetzt müsste ich nur noch in der packet_structs.py noch ein paar packete anpassen ...
aber dann hab ich die Wahl zwischen:
1) ein "schön" geschriebenes, nicht funktionsfähiges Programm,
2) ein meist zuverlässig (ich höffe das ich mich nicht verschätzt hab ...) funktionierendes, unschön programmiertes Programm

Ich hätte dann noch eine Möglichkeit drei, ich suche mir alle packte raus die immer gleich lang sind und überspringe die, und überspringe die packetstellen mit strings, metadaten ect. ... aber das ist auch wieder blos Arbeit mit höchst warscheinlich keinen nutzen ...
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Py-Prog hat geschrieben:1) ein "schön" geschriebenes, nicht funktionsfähiges Programm,
2) ein meist zuverlässig (ich höffe das ich mich nicht verschätzt hab ...) funktionierendes, unschön programmiertes Programm
Wieso schließen sich diese Fälle aus? Ich sehe nicht warum es nicht möglich sein sollte ein schön geschriebenes und funktionsfähiges Programm zu schreiben. Das das nicht klappt ist höchstens Faulheit oder Unfähigkeit.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Das ein User mit 613 Posts eine solche Frage stellt … :evil:
the more they change the more they stay the same
deets

Ich sehe nur zwei haessliche, nicht funktionierende Programme. Oder hast du schon vergessen, dass dein "gutes" Programm bei deinem Freund nicht funktioniert? Das muesste es aber - wenn es "funktionieren" soll...
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Leonidas hat geschrieben:Wieso schließen sich diese Fälle aus? Ich sehe nicht warum es nicht möglich sein sollte ein schön geschriebenes und funktionsfähiges Programm zu schreiben. Das das nicht klappt ist höchstens Faulheit oder Unfähigkeit.
oder es ist einfach nicht schnell genug ...
Dav1d hat geschrieben:Das ein User mit 613 Posts eine solche Frage stellt … :evil:
was hat das mit den Beiträgen zu tun? Nur weil sich hier einige anmelden und schon seit Jahren Programmieren und schon mit wenigen Beiträgen viele Probleme gelöst haben heißt das doch lange nicht das ich dumm bin :cry:
ach ja und mittlerweile 614 Beiträge
deets hat geschrieben:Ich sehe nur zwei haessliche
danke ... :cry:
deets hat geschrieben:nicht funktionierende Programme. Oder hast du schon vergessen, dass dein "gutes" Programm bei deinem Freund nicht funktioniert? Das muesste es aber - wenn es "funktionieren" soll...
Das lag aber nur daran das der ein sehr lames inet hat, ich hab schon kein schnelles und ich kann schneller uploaden als er downlaoden kann ... ob da jetzt ein Bug drinnen ist und manchmal nicht geht oder ob es deswegen nicht (ganz) funktioniert bleibt sich doch gleich.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
BlackJack

@Py-Prog: Wenn ein Programm nicht mit allen Eingaben klar kommt, die der Protokollspezifikation oder der verwendeten API entsprechen, dann ist da nicht ein lahmes Internet dran Schuld, sondern das fehlerhafte Programm.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Py-Prog hat geschrieben:
Dav1d hat geschrieben:Das ein User mit 613 Posts eine solche Frage stellt … :evil:
was hat das mit den Beiträgen zu tun? Nur weil sich hier einige anmelden und schon seit Jahren Programmieren und schon mit wenigen Beiträgen viele Probleme gelöst haben heißt das doch lange nicht das ich dumm bin :cry:
So meinte ich das nicht, ich wollte dir keineswegs Dummheit unterstellen, denn dann wäre ich auch ziemlich oft dumm. Mich verwundert es nur, dass du so lange hier schon dabei bist und du noch diese Frage stellst, selbst wenn du ernsthaft darüber nachdenkst, dein "unschönes" Programm zu verwenden, solltest du ja unsere Antwort dazu kennen.
the more they change the more they stay the same
deets

Py-Prog hat geschrieben:Das lag aber nur daran das der ein sehr lames inet hat, ich hab schon kein schnelles und ich kann schneller uploaden als er downlaoden kann ... ob da jetzt ein Bug drinnen ist und manchmal nicht geht oder ob es deswegen nicht (ganz) funktioniert bleibt sich doch gleich.
Du hast offensichtlich *immer* noch nicht begriffen, dass die Eigenschaften eines Netzes zu den Dingen gehoeren, auf die ein mit Netzwerken *arbeitendes* Programm ruecksicht nehmen muss. EIn langsames Internet mag aergerlich sein - aber es ist ein himmelweiter Unterschied zu einem nicht vorhandenen oder "kaputten" Internet.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

deets hat geschrieben:Du hast offensichtlich *immer* noch nicht begriffen, dass die Eigenschaften eines Netzes zu den Dingen gehoeren, auf die ein mit Netzwerken *arbeitendes* Programm ruecksicht nehmen muss. EIn langsames Internet mag aergerlich sein - aber es ist ein himmelweiter Unterschied zu einem nicht vorhandenen oder "kaputten" Internet.
Was ist besser ein "schönes" nichtfunktionierendes Programm oder ein unschönes meist funktionierende Programm? Ich weiß das es eigentlich immer funktionieren müsste und das es mit allem was passieren kann zurecht kommen muss, aber das geht nicht weil es dann zu langsam ist. Ich könnte nur noch ein unschönes Programm schreiben das funktioniert und schnell genug ist, aber das ist ja dann unschön und sowas darf man ja nicht hernemen auch wenn es schön aus irgendeinen Grund nicht geht. :roll:
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
BlackJack

@Py-Prog: Wie kommt denn jetzt die Geschwindigkeit des Programms ins Spiel? Wo hast Du denn etwas unschön und kaputt implementiert, weil es ordentlich zu langsam wäre?

Es ist nicht *irgendein* Grund warum es „schön” nicht geht. Das geht nämlich. Nur kannst oder willst Du das nicht machen. Wobei es hier auch nicht wirklich um ein subjektives „schön”, sondern schlicht um das objektive „robust” geht. Letztendlich ob das Programm kaputt ist oder nicht.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Py-Prog hat geschrieben: Was ist besser ein "schönes" nichtfunktionierendes Programm oder ein unschönes meist funktionierende Programm?
Ein *meist* funktionierendes Programm ist doch nur eine andere Ausdrucksweise für nicht funktionierend ;-) Insofern würde ich immer das schönere vorziehen, wenn beide Alternativen ansonsten gleichwertig sind. Denn das kann man idR. eher zu einem funktionierenden machen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
deets

Py-Prog hat geschrieben:
deets hat geschrieben:Du hast offensichtlich *immer* noch nicht begriffen, dass die Eigenschaften eines Netzes zu den Dingen gehoeren, auf die ein mit Netzwerken *arbeitendes* Programm ruecksicht nehmen muss. EIn langsames Internet mag aergerlich sein - aber es ist ein himmelweiter Unterschied zu einem nicht vorhandenen oder "kaputten" Internet.
Was ist besser ein "schönes" nichtfunktionierendes Programm oder ein unschönes meist funktionierende Programm? Ich weiß das es eigentlich immer funktionieren müsste und das es mit allem was passieren kann zurecht kommen muss, aber das geht nicht weil es dann zu langsam ist. Ich könnte nur noch ein unschönes Programm schreiben das funktioniert und schnell genug ist, aber das ist ja dann unschön und sowas darf man ja nicht hernemen auch wenn es schön aus irgendeinen Grund nicht geht. :roll:
Zuerstmal ist ein nicht funktionierendes Programm nicht schoen. Und das, was du da oben gezeigt hast schonmal gar nicht. Und dass da was zu langsam waere bezweifele ich sehr stark - da es nicht funktioniert, kannst du das ja noch nicht mal *wissen*, oder?

Du drueckst dich mit diesem ganzen Gerede doch nur darum rum, es richtig zu machen. Kannste ja gerne tun, am Ende ist mir voellig egal, ob das was du programmierst, laeuft oder nicht. Aber wenn du hier Rat willst, dann solltest du den auch umsetzen - sonst werden die Leute hier sich den in Zukunft sparen.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

deets hat geschrieben: Zuerstmal ist ein nicht funktionierendes Programm nicht schoen. Und das, was du da oben gezeigt hast schonmal gar nicht. Und dass da was zu langsam waere bezweifele ich sehr stark - da es nicht funktioniert, kannst du das ja noch nicht mal *wissen*, oder?

Du drueckst dich mit diesem ganzen Gerede doch nur darum rum, es richtig zu machen. Kannste ja gerne tun, am Ende ist mir voellig egal, ob das was du programmierst, laeuft oder nicht. Aber wenn du hier Rat willst, dann solltest du den auch umsetzen - sonst werden die Leute hier sich den in Zukunft sparen.
Natürlich *weiß* ich das es zulansam ist, es braucht ewig bis Minecraft lädt und dann kommt sehe ich kurz wie Minecraft anfängt die welt aufzubauen und dann gibt es eine Fehler Meldung bei Minecraft, bei dem Programm gibt es mittlerweile auch eine aber es braucht trotzdem viel zu lange.

Und ich Drücke mich nicht da vor es richtig zu machen! Ich will ja das es funktioniert! Ich hab bloß keinen Bock meine Zeit zu verschwenden wenn es zulangsam ist und deswegen dann nicht geht.

Ach ja und könnte mir mal wer diese Logik erklären: "ich würde lieber das überhaupnicht funktionierende Programm verwenden als das andere, was nur manchmal teilweise nicht funktioniert"?
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Py-Prog hat geschrieben:Ach ja und könnte mir mal wer diese Logik erklären: "ich würde lieber das überhaupnicht funktionierende Programm verwenden als das andere, was nur manchmal teilweise nicht funktioniert"?
Ich versuchs mal. Denn es heißt ja nicht dass es "manchmal teilweise nicht funktioniert" sondern "bei meinem Freund reproduzierbar nicht funktioniert".
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Leonidas hat geschrieben:Ich versuchs mal. Denn es heißt ja nicht dass es "manchmal teilweise nicht funktioniert" sondern "bei meinem Freund reproduzierbar nicht funktioniert".
Ja schon, aber das *schöne* funktioniert nicht mal bei mir ...

Ich hätte jetzt außerdem noch eine Idee, ich könnte die packte in einen Thread verarbeiten, oder in eine Dateischreiben und später verarbeiten lassen, dann wäre der Datenverkehr fast ungebremst und ich könnte das Programm trotzdem so schreiben das es immer funktioniert. Kennt jemand ein Gutes Threading tutorial, weil _thread sollte man ja nicht hernemen. Oder ist das eine Schlechte idee?
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Antworten