Hoe bytes naar gehele getallen te converteren

Jinku Hu 12 april 2022 20 december 2019
  1. Python 2,7 bytes
  2. Python 3 bytes
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
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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.

LinkedIn

Gerelateerde Artikelen - Python Bytes