python pack de 4 octets entier avec des octets dans bytearray struct.pack
Je suis d'essayer d'emballer le contenu d'un python bytearray dans un 4byte entier signé à l'aide struct.pack. Malheureusement, pack veut une chaîne de caractères, donc après quelques recherches sur google j'ai pensé que j'avais besoin de décoder mon bytearray à une chaîne. J'ai pensé ascii signifiait depuis en raison d'un caractère ascii est un octet de long. Malheureusement, ascii ne veulent pas soutenir mes valeurs > 127, j'ai donc pensé que je pourrais utiliser le remplacer...
mais quand je fais cette décoder retourne un objet de type unicode et maintenant, chacun de mes octets est un 4 chaîne de caractères...
Cela semble un peu ridicule, im manque quelque chose d'évident (ps j'ai été à l'aide de python pour environ deux semaines)
voici ce que je suis en train de faire...
val = long(-5)
s = bytearray(pack("<i", val))
s.pop() # pop off msb
# write it out the way we want to then read it in the way the code does
fout = open("test.bat", "wb")
fout.write(s)
fout.close()
fin = open("test.bat", "rb")
inBytes = bytearray(fin.read(3))
# extend sign bit
if (inBytes[2] & 0x80):
inBytes.append(0xff)
else:
inBytes.append(0x00)
nb = inBytes.decode('ascii', 'replace')
# ERROR:root:after decode, len: 4 type: <type 'unicode'>
logging.error("after decode, len: {0} type: {1}".format(len(nb), type(nb)))
# struct.error: unpack requires a string argument of length 4
inInt32 = unpack('<i', inBytes.decode('ascii', 'replace'))[0]
fin.close()
Vous devez vous connecter pour publier un commentaire.
Tous vous avez besoin est de jeter
inBytes
retour àstr
:str
;str
->bytearray
->str
est source de confusion. Aussi il n'y a pas la notion de "cast" en Python.Quand vous lisez à partir d'un fichier en mode binaire, vous obtenez un objet qui peut être utilisé immédiatement avec
struct.unpack
.De la création de l'entrée de données:
Python 2.x .. c'est un
str
objet.Python 3.x ... c'est un
bytes
objet.