Python 3で空のbytes
変数を「宣言」するにはどうすればよいですか?
バイトのチャンクを受信しようとしていますが、後でそれをutf-8文字列に変更します。ただし、一連のバイト全体を保持する初期変数を宣言する方法がわかりません。この変数はmsg
と呼ばれます。 None
とbytes
を追加できないため、NoneType
として宣言できません。それをユニコード文字列として宣言することはできません。その場合、文字列にbytes
を追加しようとするからです。また、受信プログラムが進化するにつれて、文字の一部のみを含む一連のバイトで混乱する可能性があります。 msg
宣言なしではできません。なぜなら、割り当て前にmsg
が参照されるからです。以下は問題のコードです
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))
空のバイト文字列_b''
_を使用するだけです。
ただし、文字列に繰り返し連結するには、文字列を何度もコピーする必要があります。 bytearray
(可変)は、おそらくより高速です:
_msg = bytearray() # New empty byte array
# Append data to the array
msg.extend(b"blah")
msg.extend(b"foo")
_
バイト配列を文字列にデコードするには、msg.decode(encoding='utf-8')
を使用します。
msg = bytes('', encoding = 'your encoding here')
を使用します。
デフォルトのエンコーディングを使用したい場合は、単にmsg = b''
を使用しますが、同じエンコーディングでない場合はバッファ全体がガベージになります
ドキュメントに従って:
Blockquote socket.recv(bufsize [、flags])ソケットからデータを受信します。戻り値は ストリング 受信したデータを表します。 Blockquoteだから、msg = ""はうまく動作するはずです。
>>> msg = ""
>>> msg
''
>>> len(msg)
0
>>>