Byte converteren naar int?

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 buf8-bits lang zijn.

Other episodes