2013-05-21 35 views
14

Python 3'te boş bir bytes değişkenini nasıl 'bildiriyor'?Python 3 Boş bir bayt değişkenini nasıl 'bildiriyor'

Bayt parçalarını almaya çalışıyorum ve daha sonra bunu utf-8 dizesine değiştirin. Ancak, tüm bayt dizisini tutan ilk değişkeni nasıl bildireceğimi bilmiyorum. Bu değişken msg olarak adlandırılır. bytes ve NoneType ekleyemediğiniz için None olarak bildiremiyorum. Bir unicode dizesi olarak bildiremem çünkü bir dizeye bytes eklemeye çalışacağım. Ayrıca, alıcı program geliştikçe, yalnızca karakterlerin bölümlerini içeren bayt dizisi ile karışıklığa karışabilir. msg bildirimi olmadan yapamam, çünkü atamadan önce msg başvurulan. aşağıdaki

def handleClient(conn, addr): 
    print('Connection from:', addr) 
    msg = ? 
    while 1: 
     chunk = conn.recv(1024) 
     if not chunk: 
      break 
     msg = msg + chunk 
    msg = str(msg, 'UTF-8') 
    conn.close() 
    print('Received:', unpack(msg)) 
+3

Bu başlatma değil deklarasyon içinde. Python'un tür beyanı yoktur. – geoffspear

+1

"initialization" veya "instantiation" derseniz? Belki ikisi de ... Ama dediğiniz gibi, kesinlikle "bildirim" değil – mgilson

cevap

28

Sadece boş bir bayt dize, b'' kullanmak söz konusu koddur. Bununla birlikte, bir dizgiyle birleştirme, dizgiyi birçok kez kopyalamayı içerir. Üste | değişebilirdir bir bytearray, muhtemelen daha hızlı olacaktır:

msg = bytearray() # New empty byte array 
# Append data to the array 
msg.extend(b"blah") 
msg.extend(b"foo") 

bir dizeye bayt dizisi deşifre etmek için, msg.decode(encoding='utf-8') kullanın. belgeleri uyarınca

+4

Ayrıca alınan parçaları bir listede de tutabilir ve sonunda onlara katılabilirsiniz. –

+0

Program, soket üzerinde tamamen I/O bağlı olmasa bile, performans maliyetinin aslında herhangi bir yerde önemli olacağını hayal edemiyorum. – abarnert

+2

Hızlı bir testten, 1024 baytlık 1024 baytlık, 64-bit Python 3.3.1'de 'bytes' 30.1'leri aldı, 'bytearray' 29.6'lar aldı, 'join' 29.9n aldı. – abarnert

-1

:

Blockquote socket.recv (BUFSIZE [bayraklar]) soketten Veri al. Dönüş değeri, alınan verileri temsil eden dizgisi dizisidir. Blockquote Yani, msg = "" sadece iyi çalışması gerekir düşünüyorum:

>>> msg = "" 
>>> msg 
'' 
>>> len(msg) 
0 
>>> 
+4

[Python 2.x belgeleri] (http://docs.python.org/2/library/socket.html#socket.socket.recv) adresinden alıntı yapıyorsunuz ancak soru Python 3 ile ilgilidir. 'recv' bytes' döndürür] (http://docs.python.org/3/library/socket.html#socket.socket.recv). – jwodder

+0

Python 2 ve 3 arasındaki davranış gerçekten farklı. Unicode ile ilgili ekstra koddan kurtulmak için kodumu Python 2'den 3'e taşıdım. Daha sonra bu farklılığa girdim, bu soruyu nasıl bitirdim. – tsteemers

+0

Ooops ... üzgünüm python 3'ü göremedi :( – PSS

1

kullanın msg = bytes('', encoding = 'your encoding here').

Örten sadece msg = b'' kullanın varsayılan kodlama ile gitmek istiyorum, ama bu irade çöp tüm tampon eğer onun değil aynı kodlama

İlgili konular