Python bytes的全面阐述

发布时间:2023-05-21

一、bytes是什么?

Python中的bytes是一种不可变的二进制类型。与字符串类型不同,它是由0到255之间的整数构成的序列。bytes通过b前缀表示。在Python 2中,还有一个类似的数据类型称为字符串。 bytes类型在处理二进制数据,如图片和视频文件,以及与外部系统进行网络通信时非常有用。

b = b'Hello World'
print(b)

二、bytes的常规操作

bytes类型可以执行大多数和字符串相关的操作,例如索引、切片和拼接。但是需要注意的是,这些操作返回的都是新的bytes对象,而不是原始bytes对象。

1. 索引和切片

b = b'Hello World'
print(b[0]) # 72
print(b[2:5]) # b'llo'

2. 拼接

使用加号(+)进行拼接,但是需要注意的是两个bytes对象之间才能拼接。如果想将字符串与bytes对象拼接在一起,需要使用encode()方法将字符串转换为bytes对象。

b1 = b'Hello'
b2 = b'World'
b3 = b1 + b2
print(b3) # b'HelloWorld'
s = '!'
b4 = b3 + s.encode()
print(b4) # b'HelloWorld!'

三、bytes的常规方法

1. find()

在bytes中查找子串并返回其位置。如果存在多个匹配项,则返回第一个。如果找不到,则返回-1。

b = b'Hello World'
pos = b.find(b'World')
print(pos) # 6

2. replace()

用另一个bytes对象替换指定的子串,并返回新的bytes对象。如果找不到任何匹配项,则返回原始bytes对象。

b = b'Hello World'
new_b = b.replace(b'Hello', b'Hi')
print(new_b) # b'Hi World'

3. split()

返回一个由子串分割的bytes对象列表。如果未指定分隔符,则默认以空格分割。

b = b'Hello World'
b_list = b.split()
print(b_list) # [b'Hello', b'World']

四、bytes与文件处理

bytes类型与文件处理密切相关。在读取文件时,以二进制模式打开文件并使用read()方法读取它。在写入文件时,将二进制数据写入文件。

1. 读取文件

在读取文件时,以二进制模式打开文件并使用read()方法即可。

with open('example.txt', 'rb') as f:
    b = f.read()
    print(b) # b'Hello World'

2. 写入文件

在写入文件时,需要以二进制模式打开文件并使用write()方法,将二进制数据写入文件。

b = b'Hello World'
with open('example.txt', 'wb') as f:
    f.write(b)

五、bytes与网络编程

bytes类型在网络编程中非常重要。在与外部系统通信时,需要将数据以二进制格式发送和接收。常见的例子包括HTTP请求、SMTP协议等。 在socket编程中,通常使用bytes对象表示消息。客户端和服务器之间交换的任何消息都是bytes对象。例如,发送一个包含“Hello World”的消息:

import socket
HOST = 'localhost'
PORT = 1337
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    message = b'Hello World'
    s.sendall(message)
    data = s.recv(1024)
    print('Received', repr(data))

六、bytes与数据加密

由于bytes类型是不可变的,因此非常适合用于数据加密。例如,在Python中使用HMAC(散列消息身份验证代码)时,输入可以是bytes类型。

import hmac
import hashlib
key = b'secret_key'
msg = b'Hello World'
h = hmac.new(key, msg, hashlib.sha256)
print(h.hexdigest()) # 6f1488db8abae9b2f8cfcf152d529272d0fa94720020d725dc628d5a5e033e8c