binascii --- Chuyển đổi giữa nhị phân và ASCII


Mô-đun binascii chứa một số phương thức để chuyển đổi giữa nhị phân và các biểu diễn nhị phân được mã hóa ASCII khác nhau. Thông thường, bạn sẽ không sử dụng trực tiếp các chức năng này mà thay vào đó hãy sử dụng các mô-đun trình bao bọc như base64. Mô-đun binascii chứa các hàm cấp thấp được viết bằng C để có tốc độ cao hơn được các mô-đun cấp cao hơn sử dụng.

Ghi chú

Các hàm a2b_* chấp nhận chuỗi Unicode chỉ chứa các ký tự ASCII. Các chức năng khác chỉ chấp nhận bytes-like objects (chẳng hạn như bytes, bytearray và các đối tượng khác hỗ trợ giao thức bộ đệm).

Thay đổi trong phiên bản 3.3: Các chuỗi unicode chỉ dành cho ASCII hiện được các hàm a2b_* chấp nhận.

Mô-đun binascii xác định các chức năng sau:

binascii.a2b_uu(string)

Chuyển đổi một dòng dữ liệu được mã hóa uuencode thành nhị phân và trả về dữ liệu nhị phân. Các dòng thường chứa 45 byte (nhị phân), ngoại trừ dòng cuối cùng. Dữ liệu dòng có thể được theo sau bởi khoảng trắng.

binascii.b2a_uu(data, *, backtick=False)

Chuyển đổi dữ liệu nhị phân thành dòng ký tự ASCII, giá trị trả về là dòng được chuyển đổi, bao gồm char dòng mới. Độ dài của data tối đa phải là 45. Nếu backtick đúng, các số 0 được biểu thị bằng '`' thay vì dấu cách.

Thay đổi trong phiên bản 3.7: Đã thêm tham số backtick.

binascii.a2b_base64(string, /, *, strict_mode=False)

Chuyển đổi một khối dữ liệu base64 trở lại dạng nhị phân và trả về dữ liệu nhị phân. Nhiều hơn một dòng có thể được thông qua cùng một lúc.

Nếu strict_mode là đúng, chỉ dữ liệu base64 hợp lệ mới được chuyển đổi. Dữ liệu base64 không hợp lệ sẽ tăng binascii.Error.

Cơ sở64 hợp lệ:

  • Phù hợp với RFC 3548.

  • Chỉ chứa các ký tự từ bảng chữ cái base64.

  • Không chứa dữ liệu dư thừa sau khi đệm (bao gồm phần đệm thừa, dòng mới, v.v.).

  • Không bắt đầu bằng phần đệm.

Thay đổi trong phiên bản 3.11: Đã thêm tham số strict_mode.

binascii.b2a_base64(data, *, newline=True)

Chuyển đổi dữ liệu nhị phân thành dòng ký tự ASCII trong mã hóa base64. Giá trị trả về là dòng được chuyển đổi, bao gồm char dòng mới nếu newline là đúng. Đầu ra của hàm này tuân theo RFC 3548.

Thay đổi trong phiên bản 3.6: Đã thêm tham số newline.

binascii.a2b_qp(data, header=False)

Chuyển đổi một khối dữ liệu có thể in được trích dẫn trở lại dạng nhị phân và trả về dữ liệu nhị phân. Nhiều hơn một dòng có thể được thông qua cùng một lúc. Nếu đối số tùy chọn header xuất hiện và đúng, dấu gạch dưới sẽ được giải mã thành dấu cách.

binascii.b2a_qp(data, quotetabs=False, istext=True, header=False)

Chuyển đổi dữ liệu nhị phân thành (các) dòng ký tự ASCII ở dạng mã hóa có thể in được trích dẫn. Giá trị trả về là (các) dòng được chuyển đổi. Nếu đối số tùy chọn quotetabs xuất hiện và đúng, tất cả các tab và dấu cách sẽ được mã hóa. Nếu đối số tùy chọn istext xuất hiện và đúng, các dòng mới sẽ không được mã hóa nhưng khoảng trắng ở cuối sẽ được mã hóa. Nếu đối số tùy chọn header xuất hiện và đúng, thì dấu cách sẽ được mã hóa dưới dạng dấu gạch dưới trên mỗi RFC 1522. Nếu đối số tùy chọn header xuất hiện và sai, các ký tự dòng mới cũng sẽ được mã hóa; nếu không thì việc chuyển đổi nguồn cấp dữ liệu có thể làm hỏng luồng dữ liệu nhị phân.

binascii.crc_hqx(data, value)

Tính giá trị CRC 16 bit của data, bắt đầu bằng value là CRC ban đầu và trả về kết quả. Điều này sử dụng đa thức CRC-CCITT x16 + x12 + x5 + 1, thường được biểu thị là 0x1021. Zz012zz này được sử dụng ở định dạng binhex4.

binascii.crc32(data[, value])

Tính CRC-32, tổng kiểm tra 32-bit không dấu của data, bắt đầu bằng CRC ban đầu của value. CRC ban đầu mặc định là 0. Thuật toán phù hợp với tổng kiểm tra tệp ZIP. Vì thuật toán được thiết kế để sử dụng làm thuật toán tổng kiểm tra nên nó không phù hợp để sử dụng làm thuật toán băm chung. Sử dụng như sau:

print(binascii.crc32(b"xin chào thế giới"))
# Or, chia thành hai phần:
crc = binascii.crc32(b"xin chào")
crc = binascii.crc32(b"thế giới", crc)
print('crc32 = {:#010x}'.format(crc))

Thay đổi trong phiên bản 3.0: Kết quả luôn không được ký.

binascii.b2a_hex(data[, sep[, bytes_per_sep=1]])
binascii.hexlify(data[, sep[, bytes_per_sep=1]])

Trả về biểu diễn thập lục phân của data nhị phân. Mỗi byte của data được chuyển đổi thành dạng biểu diễn hex gồm 2 chữ số tương ứng. Do đó, đối tượng byte được trả về dài gấp đôi độ dài của data.

Chức năng tương tự (nhưng trả về một chuỗi văn bản) cũng có thể truy cập thuận tiện bằng phương thức bytes.hex().

Nếu sep được chỉ định, nó phải là một đối tượng str hoặc byte ký tự đơn. Nó sẽ được chèn vào đầu ra sau mỗi byte đầu vào bytes_per_sep. Theo mặc định, vị trí dấu phân cách được tính từ đầu bên phải của đầu ra, nếu bạn muốn đếm từ bên trái, hãy cung cấp giá trị bytes_per_sep âm.

>>> import binascii
>>> binascii.b2a_hex(b'\xb9\x01\xef')
b'b901ef'
>>> binascii.hexlify(b'\xb9\x01\xef', '-')
b'b9-01-ef'
>>> binascii.b2a_hex(b'\xb9\x01\xef', b'_', 2)
b'b9_01ef'
>>> binascii.b2a_hex(b'\xb9\x01\xef', b' ', -2)
b'b901 ef'

Thay đổi trong phiên bản 3.8: Các thông số sepbytes_per_sep đã được thêm vào.

binascii.a2b_hex(hexstr)
binascii.unhexlify(hexstr)

Trả về dữ liệu nhị phân được biểu thị bằng chuỗi thập lục phân hexstr. Hàm này là nghịch đảo của b2a_hex(). hexstr phải chứa một số chẵn các chữ số thập lục phân (có thể là chữ hoa hoặc chữ thường), nếu không thì ngoại lệ Error sẽ xuất hiện.

Chức năng tương tự (chỉ chấp nhận đối số chuỗi văn bản, nhưng tự do hơn đối với khoảng trắng) cũng có thể truy cập được bằng phương thức lớp bytes.fromhex().

exception binascii.Error

Ngoại lệ được đưa ra do lỗi. Đây thường là lỗi lập trình.

exception binascii.Incomplete

Ngoại lệ được nêu ra trên dữ liệu không đầy đủ. Đây thường không phải là lỗi lập trình nhưng có thể được xử lý bằng cách đọc thêm một chút dữ liệu và thử lại.

Xem thêm

Mô-đun base64

Hỗ trợ mã hóa kiểu base64 tuân thủ RFC ở cơ sở 16, 32, 64 và 85.

Mô-đun quopri

Hỗ trợ mã hóa có thể in được trong trích dẫn được sử dụng trong email MIME.