Làm cách nào để bạn cộng các byte lại với nhau trong python?
Sự khác biệt giữa >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'2 và >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'3 là >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'2 trả về một đối tượng không thể sửa đổi và >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'3 trả về một đối tượng có thể sửa đổi Show PEP này đề xuất thêm các thao tác định dạng % tương tự như loại >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'6 của Python 2 vào >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'7 và >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'8 [1] [2] cơ sở lý luậnMặc dù phép nội suy thường được coi là một thao tác chuỗi, nhưng có những trường hợp nội suy trên >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'7 hoặc ("%x" % val).encode("ascii")2 có ý nghĩa và công việc cần thiết để bù cho chức năng bị thiếu này làm giảm khả năng đọc tổng thể của mã Động lựcVới Python 3 và sự phân chia giữa >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'6 và >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'7, một lĩnh vực lập trình nhỏ nhưng quan trọng trở nên khó khăn hơn một chút và đau đớn hơn nhiều – các giao thức định dạng dây [3] Lĩnh vực lập trình này được đặc trưng bởi sự kết hợp của dữ liệu nhị phân và các đoạn văn bản tương thích ASCII (còn gọi là văn bản được mã hóa ASCII). Mang lại phép nội suy % bị hạn chế cho >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'7 và >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'8 sẽ hỗ trợ cả việc viết mã định dạng dây mới và chuyển mã định dạng dây Python 2 Các trường hợp sử dụng phổ biến bao gồm định dạng tệp ("%x" % val).encode("ascii")7 và ("%x" % val).encode("ascii")8, định dạng ("%x" % val).encode("ascii")9 và liên lạc >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'0 và >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'1, trong số nhiều trường hợp khác Đề xuất ngữ nghĩa cho định dạng >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A' 7 và >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A' 8%-nội suyTất cả các mã định dạng số ( >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'4, >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'5, >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'6, >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'7, >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'8, >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'9, ("%x" % val).encode("ascii")20, ("%x" % val).encode("ascii")21, ("%x" % val).encode("ascii")22, ("%x" % val).encode("ascii")23, ("%x" % val).encode("ascii")24, ("%x" % val).encode("ascii")25 và bất kỳ mã nào sau đó được thêm vào Python 3) sẽ được hỗ trợ và sẽ hoạt động như bình thường . Các mã không phải là số duy nhất được phép là ________ 220, ________ 221, ________ 222 và ________ 223 (đồng nghĩa với b) Đối với các mã số, sự khác biệt duy nhất giữa phép nội suy >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'6 và >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'7 (hoặc >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'8) là kết quả từ các mã này sẽ là văn bản được mã hóa ASCII, không phải unicode. Nói cách khác, đối với bất kỳ mã định dạng số nào %x ("%x" % val).encode("ascii")6 tương đương với ("%x" % val).encode("ascii") ví dụ >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A' ("%x" % val).encode("ascii")27 sẽ chèn một byte đơn, từ một ("%x" % val).encode("ascii")28 trong phạm vi (256) hoặc từ một đối số >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'7 có độ dài 1, không phải từ một >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'6 ví dụ ("%x" % val).encode("ascii")2 ("%x" % val).encode("ascii")21 sẽ chèn một loạt byte. Các byte này được thu thập theo một trong hai cách
Đặc biệt, ("%x" % val).encode("ascii")21 sẽ không chấp nhận số cũng như >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'6. >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'6 bị từ chối vì quá trình chuyển đổi chuỗi thành byte yêu cầu mã hóa và chúng tôi từ chối đoán;
("%x" % val).encode("ascii")28 được bao gồm dưới dạng từ đồng nghĩa với ("%x" % val).encode("ascii")21 với mục đích duy nhất là làm cho 2/3 cơ sở mã dễ bảo trì hơn. Mã chỉ Python 3 nên sử dụng ("%x" % val).encode("ascii")21 ví dụ ("%x" % val).encode("ascii")2 >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'71 sẽ cho giá trị tương đương với >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'72 trên giá trị nội suy. Các trường hợp sử dụng bao gồm phát triển một giao thức mới và ghi các mốc vào luồng; >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'74 được bao gồm dưới dạng từ đồng nghĩa với >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'71 với mục đích duy nhất là làm cho 2/3 cơ sở mã dễ bảo trì hơn. Python 3 chỉ sử dụng mã >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'71 [7] ví dụ ("%x" % val).encode("ascii")2 Khả năng tương thích với Python 2Như đã lưu ý ở trên, ("%x" % val).encode("ascii")28 và >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'74 chỉ được đưa vào để giúp dễ dàng di chuyển từ và/hoặc có một cơ sở mã duy nhất với Python 2. Điều này rất quan trọng vì có các mô-đun cả trong tự nhiên và đằng sau cánh cửa đóng kín hiện đang sử dụng loại Python 2 >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'6 làm bộ chứa >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'7 và do đó đang sử dụng ("%x" % val).encode("ascii")28 làm bộ nội suy byte Tuy nhiên, ("%x" % val).encode("ascii")21 và >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'71 nên được sử dụng trong mã mới, chỉ dành cho Python 3, vì vậy, ("%x" % val).encode("ascii")28 và >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'74 sẽ ngay lập tức bị phản đối, nhưng không bị xóa khỏi 3. dòng x [7] Các biến thể được đề xuấtNó đã được đề xuất để tự động sử dụng >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'86 cho các đối số của >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'6 đối với ("%x" % val).encode("ascii")21
Nó đã được đề xuất để có ("%x" % val).encode("ascii")21 trả về repr được mã hóa ascii khi giá trị là một >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'6 (b'%b' % 'abc' -> b“'abc'”)
Ban đầu, PEP này cũng đề xuất thêm định dạng kiểu định dạng, nhưng người ta quyết định rằng định dạng và bộ máy liên quan của nó đều hoàn toàn dựa trên văn bản (còn gọi là >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'6) và nó đã bị loại bỏ Nhiều phương pháp đặc biệt mới đã được đề xuất, chẳng hạn như >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'62, >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'63, v.v. ; Một PEP cạnh tranh, PEP 460 Thêm định dạng và nội suy nhị phân, cũng tồn tại phản đốiNhững phản đối đối với PEP này chủ yếu là các biến thể về hai chủ đề
Như đã thấy trong cuộc thảo luận, >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'7 và >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'8 cũng được sử dụng cho dữ liệu nhị phân hỗn hợp và các phân đoạn tương thích với ASCII. các định dạng tệp như ("%x" % val).encode("ascii")7 và ("%x" % val).encode("ascii")8, các giao thức mạng như >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'72 và ("%x" % val).encode("ascii")9, v.v. >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'7 và >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'8 đã có một số phương thức giả sử mã hóa tương thích ASCII. >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'76, >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'77 và >>> b'%4x' % 10 b' a' >>> b'%#4x' % 10 ' 0xa' >>> b'%04X' % 10 '000A'78 chỉ kể tên một số. %-interpolation, với ngôn ngữ nhỏ rất hạn chế của nó, sẽ không gây phiền toái hơn các phương thức hiện có Một số đã phản đối việc cho phép đầy đủ các mã định dạng số với tuyên bố rằng chỉ số thập phân là đủ. Tuy nhiên, ít nhất hai định dạng (dbf và pdf) sử dụng các số không phải là số thập phân |