Pythonのbytes型とbytearray型は、バイナリデータを扱うための重要な機能です。ネットワーク通信、ファイル操作、暗号化など、様々な場面で活躍します。本記事では、bytes型とbytearray型の基本から応用まで、その違いを含めて網羅的に解説していきます。
bytes型は、0から255までの整数値を要素として持つ不変のシーケンスです。
主にバイナリデータの表現に使用されます。
bytearray型は、bytes型と同様に0から255までの整数値を要素として持ちますが、可変(ミュータブル)なシーケンスです。
# バイトリテラルを使用
b1 = b'Hello'
# bytes()コンストラクタを使用
b2 = bytes([72, 101, 108, 108, 111])
# 文字列をエンコード
s = 'Hello'
b3 = s.encode('utf-8')
# 空のbytearray
ba1 = bytearray()
# サイズを指定して初期化
ba2 = bytearray(5)
# イテラブルから作成
ba3 = bytearray([72, 101, 108, 108, 111])
# 文字列から作成
ba4 = bytearray('Hello', 'utf-8')
b = b'Hello, World!'
print(b[7:12]) # b'World'
ba = bytearray(b'Hello')
ba[0] = 74 # 'H' を 'J' に変更
ba.append(33) # '!' を追加
ba.extend(b' World') # 文字列を追加
print(ba.decode('utf-8')) # 'Jello! World'
with open('binary.dat', 'rb') as f:
content = f.read() # bytes型で読み込まれる
with open('binary.dat', 'rb') as f:
content = bytearray(f.read())
content[0] = 255 # 最初のバイトを変更
with open('binary.dat', 'wb') as f:
f.write(content)
import socket
# サーバーサイド
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('localhost', 8888))
server.listen(1)
conn, addr = server.accept()
data = conn.recv(1024) # bytes型で受信
modified_data = bytearray(data)
modified_data[0] = 65 # 最初のバイトを'A'に変更
conn.send(modified_data)
from cryptography.fernet import Fernet
key = Fernet.generate_key()
f = Fernet(key)
message = b"Secret message"
encrypted = f.encrypt(message) # bytes型で暗号化
decrypted = f.decrypt(encrypted) # bytes型で復号
bytes型とbytearray型は、Pythonでバイナリデータを扱う上で非常に強力なツールです。bytes型は不変で読み取り専用のデータに適しており、bytearray型は可変で動的な操作が必要なデータに適しています。用途に応じて適切な型を選択することで、効率的なバイナリデータ処理が可能になります。ネットワーク通信、ファイル操作、暗号化など、様々な場面でこれらの型を活用することで、より柔軟で効果的なプログラミングが実現できるでしょう。