web-dev-qa-db-ja.com

Python 3空の `bytes`変数を '宣言'する方法

Python 3で空のbytes変数を「宣言」するにはどうすればよいですか?

バイトのチャンクを受信しようとしていますが、後でそれをutf-8文字列に変更します。ただし、一連のバイト全体を保持する初期変数を宣言する方法がわかりません。この変数はmsgと呼ばれます。 Nonebytesを追加できないため、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))
22
tsteemers

空のバイト文字列_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')を使用します。

47

msg = bytes('', encoding = 'your encoding here')を使用します。

デフォルトのエンコーディングを使用したい場合は、単にmsg = b''を使用しますが、同じエンコーディングでない場合はバッファ全体がガベージになります

1
Dr. Sahib

ドキュメントに従って:

Blockquote socket.recv(bufsize [、flags])ソケットからデータを受信します。戻り値は ストリング 受信したデータを表します。 Blockquoteだから、msg = ""はうまく動作するはずです。

>>> msg = ""
>>> msg
''
>>> len(msg)
0
>>>
0
PSS