Ik werk momenteel aan een coderings-/decoderingsprogramma en ik moet bytes naar een geheel getal kunnen converteren. Ik weet dat:
bytes([3]) = b'\x03'
Toch kan ik niet vinden hoe ik het omgekeerde moet doen. Wat doe ik vreselijk verkeerd?
Antwoord 1, autoriteit 100%
Ervan uitgaande dat je minimaal 3.2 gebruikt, is er een ingebouwd voor dit:
int.from_bytes( bytes, byteorder, *, ondertekend=False)
…
Het argument bytes moet een bytes-achtig object zijn of een iterabel
bytes produceren.Het argument byteorder bepaalt de bytevolgorde die wordt gebruikt om de . weer te geven
geheel getal. Als de bytevolgorde “groot” is, is de meest significante byte aan de
begin van de byte-array. Als bytevolgorde “klein” is, het meest
significante byte staat aan het einde van de byte-array. Om de . aan te vragen
native bytevolgorde van het hostsysteem, gebruik sys.byteorder als byte
bestelwaarde.Het ondertekende argument geeft aan of het complement van twee wordt gebruikt om
vertegenwoordig het gehele getal.
## Examples:
int.from_bytes(b'\x00\x01', "big") # 1
int.from_bytes(b'\x00\x01', "little") # 256
int.from_bytes(b'\x00\x10', byteorder='little') # 4096
int.from_bytes(b'\xfc\x00', byteorder='big', signed=True) #-1024
Antwoord 2, autoriteit 6%
Lijsten met bytes zijn onderschrijfbaar (tenminste in Python 3.6). Op deze manier kunt u de decimale waarde van elke byte afzonderlijk ophalen.
>>> intlist = [64, 4, 26, 163, 255]
>>> bytelist = bytes(intlist) # b'@x04\x1a\xa3\xff'
>>> for b in bytelist:
... print(b) # 64 4 26 163 255
>>> [b for b in bytelist] # [64, 4, 26, 163, 255]
>>> bytelist[2] # 26
Antwoord 3, autoriteit 2%
int.from_bytes( bytes, byteorder, *, signed=False )
werkt niet bij mij
Ik heb de functie van deze website gebruikt, het werkt goed
https:/ /coderwall.com/p/x6xtxq/convert-bytes-to-int-or-int-to-bytes-in-python
def bytes_to_int(bytes):
result = 0
for b in bytes:
result = result * 256 + int(b)
return result
def int_to_bytes(value, length):
result = []
for i in range(0, length):
result.append(value >> (i * 8) & 0xff)
result.reverse()
return result
Antwoord 4
In het geval van werken met gebufferde gegevens vond ik dit handig:
int.from_bytes([buf[0],buf[1],buf[2],buf[3]], "big")
Ervan uitgaande dat alle elementen in buf
8-bits lang zijn.