Tôi đang sử dụng Python 3.5
Tôi có một vài chuỗi byte đại diện cho văn bản được mã hóa trong các codec khác nhau, vì vậy: b'mybytesstring'
, bây giờ một số được mã hóa Utf8
khác là latin1
, v.v. Điều tôi muốn theo thứ tự sau là:
- Chuyển đổi chuỗi byte thành chuỗi giống như ASCII.
- Chuyển đổi ASCII giống như chuỗi trở lại chuỗi byte.
- Giải mã chuỗi byte với codec chính xác.
Vấn đề là tôi phải di chuyển chuỗi byte thành một thứ không chấp nhận các đối tượng byte nên tôi đang tìm kiếm một giải pháp cho phép tôi làm bytes -> ascii -> bytes
một cách an toàn.
Sjakobi
3,4661 Huy hiệu vàng25 Huy hiệu bạc42 Huy hiệu đồng1 gold badge25 silver badges42 bronze badges
Đã hỏi ngày 6 tháng 9 năm 2017 lúc 22:30Sep 6, 2017 at 22:30
2
x = x.decode[].encode['ascii',errors='ignore']
Đã trả lời ngày 6 tháng 9 năm 2017 lúc 22:32Sep 6, 2017 at 22:32
DyzdyzDYZ
53.1k10 Huy hiệu vàng61 Huy hiệu bạc89 Huy hiệu đồng10 gold badges61 silver badges89 bronze badges
Bạn sử dụng các phương pháp encode
và decode
cho việc này và cung cấp mã hóa mong muốn cho chúng. Tôi không rõ nếu bạn biết mã hóa trước đó. Nếu bạn không biết điều đó, bạn đang gặp rắc rối. Bạn có thể phải đoán mã hóa theo một cách nào đó, mạo hiểm đầu ra rác.
Đã trả lời ngày 6 tháng 9 năm 2017 lúc 22:34Sep 6, 2017 at 22:34
Irmen de Jongirmen de JongIrmen de Jong
2.6381 Huy hiệu vàng13 Huy hiệu bạc26 Huy hiệu đồng1 gold badge13 silver badges26 bronze badges
1
Được rồi, tôi đã tìm thấy một giải pháp dễ dàng hơn nhiều so với tôi nghĩ
mybytes = 'ëýđþé'.encode[]
str_mybytes = str[mybytes]
again_mybytes = eval[str_mybytes]
decoded = again_mybytes.decode['utf8']
Đã trả lời ngày 7 tháng 9 năm 2017 lúc 8:10Sep 7, 2017 at 8:10
ThagorthagorThagor
7602 Huy hiệu vàng9 Huy hiệu bạc 30 Huy hiệu Đồng2 gold badges9 silver badges30 bronze badges
1
Mô-đun
mybytes = 'ëýđþé'.encode[]
str_mybytes = str[mybytes]
again_mybytes = eval[str_mybytes]
decoded = again_mybytes.decode['utf8']
0 chứa một số phương pháp để chuyển đổi giữa các biểu diễn nhị phân được mã hóa nhị phân và khác nhau. Thông thường, bạn sẽ không sử dụng các chức năng này trực tiếp nhưng sử dụng các mô -đun trình bao bọc như mybytes = 'ëýđþé'.encode[]
str_mybytes = str[mybytes]
again_mybytes = eval[str_mybytes]
decoded = again_mybytes.decode['utf8']
1 hoặc mybytes = 'ëýđþé'.encode[]
str_mybytes = str[mybytes]
again_mybytes = eval[str_mybytes]
decoded = again_mybytes.decode['utf8']
2 thay thế. Mô-đun mybytes = 'ëýđþé'.encode[]
str_mybytes = str[mybytes]
again_mybytes = eval[str_mybytes]
decoded = again_mybytes.decode['utf8']
0 chứa các hàm cấp thấp được viết bằng C cho tốc độ lớn hơn được sử dụng bởi các mô-đun cấp cao hơn.Ghi chú
mybytes = 'ëýđþé'.encode[]
str_mybytes = str[mybytes]
again_mybytes = eval[str_mybytes]
decoded = again_mybytes.decode['utf8']
4 Chức năng chấp nhận các chuỗi Unicode chỉ chứa các ký tự ASCII. Các chức năng khác chỉ chấp nhận các đối tượng giống như byte [chẳng hạn như mybytes = 'ëýđþé'.encode[]
str_mybytes = str[mybytes]
again_mybytes = eval[str_mybytes]
decoded = again_mybytes.decode['utf8']
5, mybytes = 'ëýđþé'.encode[]
str_mybytes = str[mybytes]
again_mybytes = eval[str_mybytes]
decoded = again_mybytes.decode['utf8']
6 và các đối tượng khác hỗ trợ giao thức bộ đệm].bytes-like objects [such as mybytes = 'ëýđþé'.encode[]
str_mybytes = str[mybytes]
again_mybytes = eval[str_mybytes]
decoded = again_mybytes.decode['utf8']
5, mybytes = 'ëýđþé'.encode[]
str_mybytes = str[mybytes]
again_mybytes = eval[str_mybytes]
decoded = again_mybytes.decode['utf8']
6 and other objects that support the buffer protocol].Thay đổi trong phiên bản 3.3: Các chuỗi unicode chỉ ASCII-ASCII-hiện được chấp nhận bởi các hàm
4.ASCII-only unicode strings are now accepted by
the mybytes = 'ëýđþé'.encode[]
str_mybytes = str[mybytes]
again_mybytes = eval[str_mybytes]
decoded = again_mybytes.decode['utf8']
mybytes = 'ëýđþé'.encode[]
str_mybytes = str[mybytes]
again_mybytes = eval[str_mybytes]
decoded = again_mybytes.decode['utf8']
4 functions.Mô -đun
mybytes = 'ëýđþé'.encode[]
str_mybytes = str[mybytes]
again_mybytes = eval[str_mybytes]
decoded = again_mybytes.decode['utf8']
0 xác định các chức năng sau:
Binascii.a2b_uu [Chuỗi] ¶a2b_uu[string]¶Chuyển đổi một dòng dữ liệu uuencoded trở lại nhị phân và trả lại dữ liệu nhị phân. Các dòng thường chứa 45 [nhị phân] byte, 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 [dữ liệu, *, backtick = false] ¶b2a_uu[data, *, backtick=False]¶Chuyển đổi dữ liệu nhị phân thành một dòng các ký tự ASCII, giá trị trả về là dòng được chuyển đổi, bao gồm cả char mới. Độ dài của dữ liệu phải nhiều nhất là 45. Nếu Backtick là đúng, các số không được biểu thị bằng
mybytes = 'ëýđþé'.encode[]
str_mybytes = str[mybytes]
again_mybytes = eval[str_mybytes]
decoded = again_mybytes.decode['utf8']
9 thay vì không gian.Đã thay đổi trong phiên bản 3.7: Đã thêm tham số BackTick.Added the backtick parameter.
Binascii.a2b_base64 [chuỗi, /, *, strict_mode = false] ¶a2b_base64[string, /, *, strict_mode=False]¶Chuyển đổi một khối dữ liệu Base64 trở lại nhị phân và trả lại dữ liệu nhị phân. Nhiều hơn một dòng có thể được thông qua tại một thời điểm.
Nếu strict_mode là đúng, chỉ có dữ liệu base64 hợp lệ sẽ được chuyển đổi. Dữ liệu Base64 không hợp lệ sẽ tăng
print[binascii.crc32[b"hello world"]] # Or, in two pieces: crc = binascii.crc32[b"hello"] crc = binascii.crc32[b" world", crc] print['crc32 = {:#010x}'.format[crc]]0.Cơ sở hợp lệ64:
Phù hợp với RFC 3548.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 đệm dư, newlines, v.v.].
Không bắt đầu với một đệm.
Đã thay đổi trong phiên bản 3.11: Đã thêm tham số StricT_Mode.Added the strict_mode parameter.
Binascii.b2a_base64 [dữ liệu, *, newline = true] ¶b2a_base64[data, *, newline=True]¶Chuyển đổi dữ liệu nhị phân thành một dòng các ký tự ASCII trong mã hóa Base64. Giá trị trả về là dòng được chuyển đổi, bao gồm cả char mới nếu dòng mới là đúng. Đầu ra của hàm này phù hợp với RFC 3548.RFC 3548.
Đã thay đổi trong phiên bản 3.6: Đã thêm tham số Newline.Added the newline parameter.
Binascii.a2b_qp [dữ liệu, tiêu đề = false] ¶a2b_qp[data, header=False]¶Chuyển đổi một khối dữ liệu được in được trích dẫn trở lại nhị phân và trả lại dữ liệu nhị phân. Nhiều hơn một dòng có thể được thông qua tại một thời điểm. Nếu tiêu đề đối số tùy chọn có mặt và đúng, gạch dưới sẽ được giải mã dưới dạng không gian.
Binascii.b2a_qp [Data, quotetabs = false, istext = true, header = false]b2a_qp[data, quotetabs=False, istext=True, header=False]¶Chuyển đổi dữ liệu nhị phân thành một dòng của các ký tự ASCII trong mã hóa được in được trích dẫn. Giá trị trả về là [các] dòng được chuyển đổi. Nếu các trích dẫn đối số tùy chọn có mặt và đúng, tất cả các tab và khoảng trống sẽ được mã hóa. Nếu đối số tùy chọn Istext có mặt và đúng, Newlines không được mã hóa nhưng khoảng trắng sẽ được mã hóa. Nếu tiêu đề đối số tùy chọn có mặt và đúng, các không gian sẽ được mã hóa dưới dạng dấu gạch dưới trên RFC 1522. Nếu tiêu đề đối số tùy chọn có mặt và sai, các ký tự mới cũng sẽ được mã hóa; Nếu không thì chuyển đổi linefeed có thể làm hỏng luồng dữ liệu nhị phân.RFC 1522. If the optional argument header is present and false, newline characters will be encoded as well; otherwise linefeed conversion might corrupt the binary data stream.
Binascii.crc_hqx [dữ liệu, giá trị] ¶crc_hqx[data, value]¶Tính giá trị CRC 16 bit của dữ liệu, bắt đầu bằng giá trị 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. CRC này được sử dụng ở định dạng Binhex4.
Binascii.crc32 [dữ liệu [, giá trị]] ¶crc32[data[, value]]¶Tính toán CRC-32, tổng kiểm tra dữ liệu 32 bit không dấu, bắt đầu bằng CRC ban đầu của giá trị. CRC ban đầu mặc định bằng không. Thuật toán phù hợp với tổng kiểm tra tệp zip. Do 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 như một thuật toán băm chung. Sử dụng như sau:
print[binascii.crc32[b"hello world"]] # Or, in two pieces: crc = binascii.crc32[b"hello"] crc = binascii.crc32[b" world", crc] print['crc32 = {:#010x}'.format[crc]]
Thay đổi trong phiên bản 3.0: Kết quả luôn không được ký.The result is always unsigned.
Binascii.b2a_hex [data [, sep [, byte_per_sep = 1]]] ¶ Binascii.hexlify [data [, sep [, byte_per_sep = 1]]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 dữ liệu nhị phân. Mỗi byte dữ liệu được chuyển đổi thành biểu diễn HEX 2 chữ số tương ứng. Do đó, đối tượng byte được trả về dài gấp đôi chiều dài của dữ liệu.
Chức năng tương tự [nhưng trả về chuỗi văn bản] cũng có thể truy cập thuận tiện bằng phương thức
print[binascii.crc32[b"hello world"]] # Or, in two pieces: crc = binascii.crc32[b"hello"] crc = binascii.crc32[b" world", crc] print['crc32 = {:#010x}'.format[crc]]1.
Nếu SEP được chỉ định, nó phải là một đối tượng STR hoặc byte đơn lẻ. Nó sẽ được chèn vào đầu ra sau mỗi byte_per_sep byte đầu vào. Vị trí phân tách được tính từ đầu bên phải của đầu ra theo mặc định, nếu bạn muốn đếm từ bên trái, hãy cung cấp giá trị byte âm_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 tham số SEP và BYTES_PER_SEP đã được thêm vào.The sep and bytes_per_sep parameters were added.
Binascii.a2b_hex [hexstr] ¶ Binascii.unhexlify [Hexstr] ¶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
print[binascii.crc32[b"hello world"]] # Or, in two pieces: crc = binascii.crc32[b"hello"] crc = binascii.crc32[b" world", crc] print['crc32 = {:#010x}'.format[crc]]2. Hexstr phải chứa một số chữ số thập lục phân [có thể là chữ hoa hoặc chữ thường], nếu không một ngoại lệ
print[binascii.crc32[b"hello world"]] # Or, in two pieces: crc = binascii.crc32[b"hello"] crc = binascii.crc32[b" world", crc] print['crc32 = {:#010x}'.format[crc]]3 được nâng lên.
Chức năng tương tự [chỉ chấp nhận các đố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 pháp lớp
print[binascii.crc32[b"hello world"]] # Or, in two pieces: crc = binascii.crc32[b"hello"] crc = binascii.crc32[b" world", crc] print['crc32 = {:#010x}'.format[crc]]4. Exceptionbinascii.error¶binascii.Error¶
Ngoại lệ nêu ra lỗi. Đây thường là những lỗi lập trình.
Exceptionbinascii.incomplete¶binascii.Incomplete¶Ngoại lệ được nâng lên 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ô -đunmybytes = 'ëýđþé'.encode[]
str_mybytes = str[mybytes]
again_mybytes = eval[str_mybytes]
decoded = again_mybytes.decode['utf8']
2Hỗ trợ mã hóa kiểu Base64 tuân thủ RFC trong cơ sở 16, 32, 64 và 85.
Mô -đunmybytes = 'ëýđþé'.encode[]
str_mybytes = str[mybytes]
again_mybytes = eval[str_mybytes]
decoded = again_mybytes.decode['utf8']
1Hỗ trợ mã hóa UU được sử dụng trên Unix.
Mô -đunprint[binascii.crc32[b"hello world"]] # Or, in two pieces: crc = binascii.crc32[b"hello"] crc = binascii.crc32[b" world", crc] print['crc32 = {:#010x}'.format[crc]]7
Hỗ trợ cho mã hóa được in được in được sử dụng trong các tin nhắn email MIME.