Hoe bytes naar gehele getallen te converteren

Bytes
gegevenstype heeft een waarde variërend van 0 tot 255 (0x00 tot 0xFF). Eén byte heeft 8 bits, daarom is de maximale waarde 0xFF. In sommige omstandigheden moet u bytes of bytesarray converteren naar gehele getallen voor verdere gegevensverwerking. In dit korte artikel wordt beschreven hoe u de conversie van bytes naar gehele getallen uitvoert.
Python 2,7 bytes
Er is geen ingebouwd bytes
gegevenstype in de Python 2.7-versie. Trefwoord byte
is identiek aan str
.
>>> bytes is str
True
bytearray
wordt gebruikt om een bytes
of byte array
object te definiëren.
>>> byteExample1 = bytearray([1])
>>> byteExample1
bytearray(b'\x01')
>>> byteExample2 = bytearray([1,2,3])
>>> byteExample2
bytearray(b'\x01\x02\x03')
Converteer bytes naar gehele getallen in Python 2.7
Python interne module struct
kan binaire gegevens (bytes) converteren naar gehele getallen. Het kan bytes of eigenlijk strings in Python 2.7 converteren en gehele getallen in twee richtingen.
struct.unpack(fmt, string)
Convert the string according to the given format `fmt` to integers. The result is a tuple even if there is only one item inside.
struct
Voorbeelden
import struct
testBytes = b'\x00\x01\x00\x02'
testResult = struct.unpack('>HH', testBytes)
print testResult
(1, 2)
De opmaakreeks >HH
bestaat uit twee delen. 1. >
geeft aan dat de binaire gegevens zijn big-endian
, of met andere woorden, de gegevens zijn geordend aan het grote uiteinde (meest significante bit). Bijvoorbeeld \x00\0x1
betekent \x00
hoog byte en \x01
lage byte. 2. HH
betekent dat er twee H
typen objecten in de tekenreeks bytes staan. H
vertegenwoordigt unsigned short
geheel getal dat 2 bytes nodig heeft.
Je kan verschillende resultaten krijgen van dezelfde string als het toegewezen gegevensformaat anders is.
>>> testResult = struct.unpack('<HH', testBytes)
>>> testResult
(256, 512)
Hier <
geeft aan dat de endianess is little-endian
. Daarom \x00\x01
wordt het 00+1*256 = 256
niet 0*256+1 = 1
meer.
>>> testResult = struct.unpack('<BBBB', testBytes)
>>> testResult
(0, 1, 0, 2)
B
betekent dat de gegevens unsigned char
1 byte nemen. Daarom \x00\x01\x00\x02
worden deze omgezet in 4 waarden van unsigned char
, niet 2 waarden van unsigned short
meer.
Waarschuwing
De datalengte die wordt weergegeven door de opmaakreeks moet dezelfde zijn als de gegeven gegevens, anders wordt een fout gemeld
>>> testResult = struct.unpack('<BBB', b'\x00\x01\x00\x02')
Traceback (most recent call last):
File "<pyshell#35>", line 1, in <module>
testResult = struct.unpack('<BBB', b'\x00\x01\x00\x02')
error: unpack requires a string argument of length 3
Je kan het officiële document van de struct
module bekijken om meer informatie te krijgen over opmaakreeksen.
Python 3 bytes
bytes
is een ingebouwd gegevenstype in Python 3, daarom kan je bytes direct definiëren met behulp van een bytes
trefwoord.
>>> testByte = bytes(18)
>>> type(testByte)
Je kan ook direct een bytes of bytesarray definiëren zoals hieronder
>>> testBytes = b'\x01\x21\31\41'
>>> type(testBytes)
Converteer bytes naar gehele getallen in Python 3
Naast de struct
module die al in Python 2.7 is geïntroduceerd, kan je ook de nieuwe ingebouwde integermethode Python 3 gebruiken om de conversie van bytes naar gehele getallen te doen, dat wil zeggen de int.from_bytes()
methode.
int.from_bytes()
Voorbeelden
>>> testBytes = b'\xF1\x10'
>>> int.from_bytes(testBytes, byteorder='big')
61712
De byteorder
optie is vergelijkbaar met de struct.unpack()
definitie van de bytevolgorde.
info
De weergave van bytes wordt geconverteerd naar één geheel getal
int.from_bytes()
heeft een derde optie signed
om het type geheel getal toe te wijzen aan signed
of unsigned
.
>>> testBytes = b'\xF1\x10'
>>> int.from_bytes(testBytes, byteorder='big', signed=True)
-3824
Gebruik []
wanneer Bytes is unsigned chart
Als de gegevensindeling de indeling heeft unsigned char
die slechts één byte bevat, kan je de objectindex rechtstreeks gebruiken om toegang te krijgen tot het gehele getal van de gegevens.
>>> testBytes = b'\xF1\x10'
>>> testBytes[0]
241
>>> testBytes[1]
16
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedInGerelateerde Artikelen - Python Bytes
- Hoe Int naar Bytes te converteren in Python 2 en Python 3
- Hoe bytes naar String te converteren in Python 2 en Python 3
- Hoe String naar Bytes te converteren in Python