Python Programming

Python 2.7 ve 3’te Baytları Tam Sayılara Dönüştürme

Spread the love

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, 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.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir