Python’ın byte’lara yaklaşımı Python 2.7 ve Python 3 arasında önemli ölçüde farklılık gösterir. Bu makale, her iki sürümde de byte’ların tamsayıya dönüştürülmesini açıklayarak kritik farklılıkları vurgular.
İçindekiler
- Python 2.7 ve Byte Dizileri
- Python 2.7’de Byte’ları Tamsayıya Dönüştürme
- Python 3 ve
bytes
Tipi - Python 3’te Byte’ları Tamsayıya Dönüştürme
Python 2.7 ve Byte Dizileri
Python 2.7’de, str
tipi hem metin hem de byte verilerini işler. Python 3’te bulunan özel bir bytes
tipi mevcut değildir. Byte dizileri, temelde byte değerlerini temsil eden karakter dizileridir. Python 2.7’nin resmi olarak kullanım dışı bırakıldığını ve yeni projelerde kullanılmaması gerektiğini hatırlamak önemlidir.
Python 2.7’de Byte’ları Tamsayıya Dönüştürme
Tek byte’ları tamsayıya dönüştürmek ord()
fonksiyonuyla yapılır:
byte_string = 'A' # 'A'nın byte değerini temsil eder
integer_value = ord(byte_string)
print(integer_value) # Çıktı: 65
ord()
, tek byte’lar için byte’ın sayısal değeriyle eşleşen Unicode kod noktasını sağlar. Daha uzun byte dizileri için, bunları daha büyük tamsayıya dönüştürmek için bit işlemleri gereklidir. Aşağıdaki örnek, little-endian byte sırasını varsayar:
byte_string = 'x01x02x03' # Örnek byte dizisi (little-endian)
integer_value = 0
for byte in byte_string:
integer_value = (integer_value << 8) | ord(byte)
print(integer_value) # Çıktı: 66051
Bu, tamsayıyı 8 bit sola kaydırır ve her byte’ı dahil etmek için bir bitsel VEYA işlemi uygular. Big-endian sırası için, yinelemeyi tersine çevirin.
Python 3 ve bytes
Tipi
Python 3, bytes
tipini açıkça tanıtarak onu str
tipinden (Unicode metin) ayırır. bytes
nesneleri, 0 ile 255 arasında değişen tamsayıların değişmez dizileridir.
Python 3’te Byte’ları Tamsayıya Dönüştürme
Python 3 daha temiz bir yaklaşım sunar. Tek bir byte için:
byte_data = b'x41' # Byte literal olduğunu gösteren 'b' öneki
integer_value = byte_data[0]
print(integer_value) # Çıktı: 65
0 indeksindeki byte’a doğrudan erişim, tamsayı değerini verir. Birden fazla byte için, byte sırası (endianness) belirtilerek int.from_bytes()
kullanılır:
byte_data = b'x01x02x03' # Little-endian örneği
integer_value = int.from_bytes(byte_data, byteorder='little')
print(integer_value) # Çıktı: 66051
byte_data = b'x01x02x03' # Big-endian örneği
integer_value = int.from_bytes(byte_data, byteorder='big')
print(integer_value) # Çıktı: 16909060
byteorder='little'
, en az anlamlı byte’ın önce geldiğini, byteorder='big'
ise en anlamlı byte’ın önce geldiğini belirtir. Taşınabilirlik için her zaman byteorder
‘ı belirtin; aksi takdirde sistemin varsayılanı kullanılır.