Résolu [PYTHON] Types VarUhInt

Inscrit
23 Janvier 2016
Messages
25
Reactions
0
#1
Hello !

Je n'ai rien trouvé à ce sujet sur le forum, mais je n'arrive pas à bien comprendre à quoi correspond le type VarUhInt,
J'ai essayé de traduire le reader en Python mais ça ne marche qu'une fois sur deux.
Je travaille sur le TreasureHuntMessage (checkPointCurrent & checkPoint total)

Je ne suis pas parti avec ctype, je travaille avec bitstring (c'est assez sale, je m'en rend compte maintenant).

je crois que je vais décale sur un autre langage c'est galère de travailler sur les types en python.

Python:
def read_var_int(self):
    value = 0
    offset = 0

    while offset < PacketWrapper.INT_SIZE:
        b = self.read_byte() # Lit 8 bits, raccourci l'input de 8 bits, retourne la valeur sour forme d'uint
        has_next = (b & PacketWrapper.MASK_10000000) == PacketWrapper.MASK_10000000  # La valeur des masques est idem que dansle codeSource, 128 pour 1000.., et 127 pour 01111..
        if offset > 0:
            value = value + ((b & PacketWrapper.MASK_01111111) << offset) # C'est ici que je ne vois pas trop
        else:
            value = value + (b & PacketWrapper.MASK_01111111)
       
        offset = offset + PacketWrapper.CHUNCK_BIT_SIZE # = 7

        if not has_next:
            return value

    raise Exception("Too much data")


def read_var_uh_int(self):
    value = self.read_var_int()
    if value < 0:
        return value + 2**32
    return value
 
Dernière édition:
Inscrit
23 Janvier 2016
Messages
25
Reactions
0
#4
VarInt Python:
from bitstring import BitArray

# ...

def read_var_int(self):
    value = 0
    offset = 0

    while offset < PacketWrapper.INT_SIZE:
        if not self.i_can_take_this_size(8):
            raise Exception("Unable to read " + str(8) + "bits, data have only " + str(len(self.data)))
        b = BitArray(bytes=self.data, length=8)
        self.data = self.data[1:]

        has_next = (b & BitArray('0b10000000')) == BitArray('0b10000000')
        if offset > 0:
            value = value + ((b & BitArray('0b01111111')).int << offset)
        else:
            value = value + (b & BitArray('0b01111111')).int
         
        offset = offset + 7

        if not has_next:
            return value

    raise Exception("Too much data")
Elle marche du tonnerre comme ça, en fait mon erreur n'était pas là :3
Je tatonais du coup j'avais pas bien tilté que les objets appelés (TreasureHuntStep dans mon cas) étaient dynamiques et deserializaient aussi
Mais maintenant ça marche :)

Edit: et pour le Uh
uh int:
def read_var_uh_int(self):
    value = self.read_var_int()
    if value < 0:
        return value + 2**32
    return value
 
Dernière édition:
Haut Bas