File: base64-example-1.py import base64 MESSAGE = "life of brian" file = open["out.txt", "w"] file.write[MESSAGE] file.close[] base64.encode[open["out.txt"], open["out.b64", "w"]] base64.decode[open["out.b64"], open["out.txt", "w"]] print "original:", repr[MESSAGE] print "encoded message:", repr[open["out.b64"].read[]] print "decoded message:", repr[open["out.txt"].read[]]original: 'life of brian'
encoded message: 'bGlmZSBvZiBicmlhbg==\012'
decoded message: 'life of brian'
Giả sử bạn có tệp hình ảnh nhị phân muốn chuyển qua mạng. Bạn ngạc nhiên vì phía bên kia không nhận được tệp đúng cách—tệp chỉ chứa các ký tự lạ
Chà, có vẻ như bạn đã cố gửi tệp của mình ở định dạng bit và byte thô, trong khi phương tiện được sử dụng được thiết kế để truyền phát văn bản
Điều gì sẽ là cách giải quyết để tránh một vấn đề như vậy? . Trong bài viết này, tôi sẽ chỉ cho bạn cách chúng ta có thể sử dụng Python để mã hóa và giải mã một hình ảnh nhị phân. Chương trình được minh họa như một chương trình cục bộ độc lập, nhưng bạn có thể áp dụng khái niệm này cho các ứng dụng khác nhau như gửi hình ảnh được mã hóa từ thiết bị di động của bạn đến máy chủ và nhiều ứng dụng khác
Base64 là gì?
Trước khi đi sâu hơn vào bài viết, hãy xác định ý nghĩa của Base64
Base64 là cách mà dữ liệu nhị phân 8 bit được mã hóa thành định dạng có thể được biểu diễn bằng 6 bit. Điều này được thực hiện chỉ bằng cách sử dụng các ký tự
67,
68,
69,
Content-Type: text/plain; charset=UTF-800 và
Content-Type: text/plain; charset=UTF-801 để biểu thị dữ liệu, với
Content-Type: text/plain; charset=UTF-802 được sử dụng để đệm dữ liệu. Chẳng hạn, sử dụng mã hóa này, ba byte 8 bit được chuyển đổi thành bốn nhóm 6 bit
Thuật ngữ Base64 được lấy từ tiêu chuẩn Phần mở rộng thư Internet đa năng [MIME], được sử dụng rộng rãi cho HTTP và XML và ban đầu được phát triển để mã hóa các tệp đính kèm email để truyền
Tại sao chúng ta sử dụng Base64?
Base64 rất quan trọng đối với việc biểu diễn dữ liệu nhị phân, vì nó cho phép dữ liệu nhị phân được biểu diễn theo cách nhìn và hoạt động như văn bản thuần túy, điều này làm cho nó đáng tin cậy hơn khi được lưu trữ trong cơ sở dữ liệu, gửi trong email hoặc sử dụng trong văn bản dựa trên . Base64 về cơ bản được sử dụng để biểu diễn dữ liệu ở định dạng chuỗi ASCII
Như đã đề cập trong phần giới thiệu của bài viết này, không có Base64 đôi khi dữ liệu sẽ không thể đọc được
Mã hóa Base64
Mã hóa Base64 là quá trình chuyển đổi dữ liệu nhị phân thành một bộ ký tự giới hạn gồm 64 ký tự. Như được hiển thị trong phần đầu tiên, những ký tự đó là
67,
68,
69,
Content-Type: text/plain; charset=UTF-800 và
Content-Type: text/plain; charset=UTF-801 [hãy đếm chúng, bạn có để ý rằng chúng cộng lại thành 64 không?]. Bộ ký tự này được coi là bộ ký tự phổ biến nhất và được gọi là Base64 của MIME. Nó sử dụng
67,
68 và
69 cho 62 giá trị đầu tiên và
Content-Type: text/plain; charset=UTF-800 và
Content-Type: text/plain; charset=UTF-801 cho hai giá trị cuối cùng
Dữ liệu được mã hóa Base64 cuối cùng dài hơn dữ liệu gốc, do đó, như đã đề cập ở trên, cứ 3 byte dữ liệu nhị phân, có ít nhất 4 byte dữ liệu được mã hóa Base64. Điều này là do thực tế là chúng tôi đang nén dữ liệu thành một tập hợp các ký tự nhỏ hơn
Bạn đã bao giờ nhìn thấy một phần của tệp email thô như tệp được hiển thị bên dưới [rất có thể bắt nguồn từ một email không được gửi] chưa? . [Nếu bạn để ý thấy
Content-Type: text/plain; charset=UTF-802 ở cuối, bạn có thể kết luận rằng đây là mã hóa Base64, vì dấu bằng được sử dụng trong quá trình mã hóa cho phần đệm. ]
1
Content-Type: text/plain; charset=UTF-8
2
Content-Transfer-Encoding: base64
3
4___
2KfZhNiz2YTYp9mFINi52YTZitmD2YUg2YjYsdit2YXYqSDYp9mE2YTZhyDZiNio2LHZg9in2KrZ
5___
h9iMDQoNCtij2YjYryDZgdmC2Lcg2KfZhNin2LPYqtmB2LPYp9ixINi52YYg2KfZhNmF2YLYsdix
64_______0
Content-Type: text/plain; charset=UTF-81
Content-Type: text/plain; charset=UTF-82
Content-Type: text/plain; charset=UTF-83
Content-Type: text/plain; charset=UTF-84
Content-Type: text/plain; charset=UTF-85
Content-Type: text/plain; charset=UTF-86
Content-Type: text/plain; charset=UTF-87
Content-Type: text/plain; charset=UTF-88
Content-Type: text/plain; charset=UTF-89
20_______20_______1
22_______20_______20_______20_______20_______2
Base64 được thực hiện theo nhiều bước, như sau
- Văn bản được mã hóa được chuyển đổi thành các giá trị thập phân tương ứng của nó, nghĩa là thành ASCII tương đương của chúng [i. e. một. 97, b. 98, v.v. ]. Đây là bảng ASCII
- Các giá trị thập phân thu được ở bước trên được chuyển đổi thành các giá trị nhị phân tương đương [i. e. 97. 01100001]
- Tất cả các số nhị phân tương đương được nối, thu được một tập hợp lớn các số nhị phân
- Tập hợp lớn các số nhị phân được chia thành các phần bằng nhau, với mỗi phần chỉ chứa 6 bit
- Các bộ 6 bit bằng nhau được chuyển đổi thành số thập phân tương đương của chúng
- Cuối cùng, các số thập phân tương đương được chuyển đổi thành các giá trị Base64 của chúng [i. e. 4. đ]. Dưới đây là các giá trị thập phân và bảng chữ cái Base64 của chúng
Giải mã Base64
Giải mã Base64 ngược lại với mã hóa Base64. Nói cách khác, nó được thực hiện bằng cách đảo ngược các bước được mô tả trong phần trước
Vì vậy, các bước giải mã Base64 có thể được mô tả như sau
- Mỗi ký tự trong chuỗi được thay đổi thành giá trị thập phân Base64
- Các giá trị thập phân thu được được chuyển đổi thành các giá trị nhị phân tương đương của chúng
- Hai bit đầu tiên của số nhị phân được cắt bớt từ mỗi số nhị phân thu được và bộ 6 bit được kết hợp, tạo thành một chuỗi lớn các chữ số nhị phân
- Chuỗi lớn các chữ số nhị phân thu được ở bước trước được chia thành các nhóm 8 bit
- Các số nhị phân 8 bit được chuyển đổi thành số thập phân tương đương của chúng
- Cuối cùng, các giá trị thập phân thu được được chuyển đổi thành ASCII tương đương của chúng
Mã hóa và giải mã Base64 của chuỗi
Bạn sẽ dễ hiểu hơn về cách thức hoạt động của tất cả những thứ này khi bạn thấy những gì đang diễn ra đằng sau hậu trường. Hãy thử mã hóa và giải mã một từ có ba chữ cái đơn giản,
Content-Type: text/plain; charset=UTF-814
Chúng tôi bắt đầu bằng cách chuyển đổi từng chữ cái của từ thành ASCII tương đương của nó, sau đó chuyển đổi ASCII tương đương thành nhị phân. Điều này mang lại cho chúng ta các giá trị sau
Chữ Giá trị chỉ mục ASCII Giá trị nhị phân 8-bitH7201001000e10101100101y12101111001Nói cách khác, chúng ta có thể viết
Content-Type: text/plain; charset=UTF-814 ở dạng nhị phân như thế này
1
28
Có tổng cộng 24 bit, khi được chuyển thành các nhóm 6 bit, mỗi kết quả sẽ có bốn giá trị
1
Content-Transfer-Encoding: base640
Trong bảng Base64, các ký tự
Content-Type: text/plain; charset=UTF-816 đến
Content-Type: text/plain; charset=UTF-817 được biểu thị bằng các giá trị từ 0 đến 25. Các ký tự
Content-Type: text/plain; charset=UTF-818 đến
Content-Type: text/plain; charset=UTF-819 được biểu thị bằng các giá trị từ 26 đến 51. Các số
Content-Type: text/plain; charset=UTF-820 đến
Content-Type: text/plain; charset=UTF-821 được biểu thị bằng các giá trị từ 52 đến 61. Các ký tự
Content-Type: text/plain; charset=UTF-800 và
Content-Type: text/plain; charset=UTF-801 được đại diện bởi 62 và 63. Ký tự
Content-Type: text/plain; charset=UTF-802 được sử dụng để đệm khi không thể chia đúng các bit thành các nhóm 6
Bây giờ chúng ta sẽ chuyển đổi các bit được sắp xếp lại thành các giá trị số và sau đó lấy ký tự đại diện cho các giá trị số đó
Giá trị nhị phân 6 bit ValueBase64 Index ValueLetter01001018S0001106G01010121V111001575Dựa trên các tính toán của chúng tôi ở trên, chữ cái
Content-Type: text/plain; charset=UTF-814 sẽ trở thành
Content-Type: text/plain; charset=UTF-826 khi được mã hóa Base64. Chúng tôi có thể kiểm tra xem điều đó có đúng không bằng cách sử dụng đoạn mã sau
1
Content-Transfer-Encoding: base642
2
3
Content-Transfer-Encoding: base645_______23_______
5
Content-Transfer-Encoding: base648
6
30
Toàn bộ quá trình được thực hiện ngược lại để lấy lại dữ liệu gốc của chúng tôi sau khi giải mã Base64
Bây giờ, tôi sẽ nhanh chóng cho bạn thấy cách mã hóa của một từ khác,
Content-Type: text/plain; charset=UTF-827, để giải thích sự xuất hiện của
Content-Type: text/plain; charset=UTF-802 trong chuỗi được mã hóaChữ Giá trị chỉ mục ASCII Giá trị nhị phân 8-bitH7201001000e10101100101y12101111001o11101101111
Có tổng cộng 32 bit. Điều này sẽ cung cấp cho chúng tôi năm nhóm 6 bit khác nhau, với hai bit còn lại.
Content-Type: text/plain; charset=UTF-829. Chúng tôi đệm chúng bằng
Content-Type: text/plain; charset=UTF-830 để có được một nhóm 6 bit. Tạo các nhóm 6 bit từ cách sắp xếp trên sẽ cung cấp cho bạn thông tin sau
1
32
Các bit được sắp xếp lại sẽ trả lại cho bạn các ký tự sau dựa trên các giá trị chỉ mục Base64
Giá trị nhị phân 6 bit ValueBase64 Index ValueLetter01001018S0001106G01010121V11100157501101127b11000048wĐiều này có nghĩa là giá trị được mã hóa Base64 của chúng tôi cho
Content-Type: text/plain; charset=UTF-827 sẽ là
Content-Type: text/plain; charset=UTF-832. Mỗi
Content-Type: text/plain; charset=UTF-802 đại diện cho một cặp
Content-Type: text/plain; charset=UTF-834 mà chúng tôi đã thêm vào để đệm chuỗi bit ban đầu
1
34_______20_______
3
37
4
5
40
6
42
Base64 Mã hóa hình ảnh
Bây giờ chúng ta hãy đi vào phần chính của bài viết này. Trong phần này, tôi sẽ chỉ cho bạn cách chúng ta có thể dễ dàng mã hóa Base64 một hình ảnh bằng Python
Tôi sẽ sử dụng hình ảnh nhị phân sau. Hãy tiếp tục và tải xuống và bắt đầu sử dụng Python. [Tôi cho rằng tên của hình ảnh là con nai. gif. ]
Điều đầu tiên chúng ta phải làm để sử dụng Base64 trong Python là nhập mô-đun base64
Content-Type: text/plain; charset=UTF-835
Để mã hóa hình ảnh, chúng ta chỉ cần sử dụng chức năng
Content-Type: text/plain; charset=UTF-836. Python mô tả chức năng như sau
Mã hóa đối tượng giống như byte
Content-Type: text/plain; charset=UTF-837 bằng Base64 và trả về các byte được mã hóa
Do đó, chúng ta có thể thực hiện các thao tác sau để mã hóa Base64 cho hình ảnh của mình
1
44
2
46
3
48
4
2KfZhNiz2YTYp9mFINi52YTZitmD2YUg2YjYsdit2YXYqSDYp9mE2YTZhyDZiNio2LHZg9in2KrZ0
Nếu bạn muốn xem đầu ra của quá trình mã hóa, hãy gõ như sau
Content-Type: text/plain; charset=UTF-838
Base64 giải mã một hình ảnh
Để giải mã một hình ảnh bằng Python, chúng ta chỉ cần sử dụng hàm
Content-Type: text/plain; charset=UTF-839. Python đề cập đến những điều sau đây về chức năng này
Giải mã đối tượng giống như byte được mã hóa Base64 hoặc chuỗi ASCII s và trả về byte đã giải mã
Vì vậy, để giải mã hình ảnh chúng tôi đã mã hóa trong phần trước, chúng tôi làm như sau
Content-Type: text/plain; charset=UTF-840
Để tất cả chúng cùng nhau
Hãy cùng nhau đặt chương trình mã hóa và giải mã Base64 cho một hình ảnh. Tập lệnh Python thực hiện điều đó sẽ trông giống như sau
1
2KfZhNiz2YTYp9mFINi52YTZitmD2YUg2YjYsdit2YXYqSDYp9mE2YTZhyDZiNio2LHZg9in2KrZ2
2
2KfZhNiz2YTYp9mFINi52YTZitmD2YUg2YjYsdit2YXYqSDYp9mE2YTZhyDZiNio2LHZg9in2KrZ4
3
2KfZhNiz2YTYp9mFINi52YTZitmD2YUg2YjYsdit2YXYqSDYp9mE2YTZhyDZiNio2LHZg9in2KrZ6
424_______8
525_______0
6___
52
Content-Type: text/plain; charset=UTF-81
54
Nếu bạn mở Deer_decode. gif mà bạn có trên máy tính để bàn của mình, bạn sẽ nhận thấy rằng bạn có hình ảnh con nai gốc. gif chúng tôi đã mã hóa trong bước đầu tiên
Như chúng ta đã thấy trong bài viết này, Python giúp dễ dàng thực hiện những gì có vẻ là một nhiệm vụ phức tạp.
Mã hóa và giải mã an toàn URL
Như tôi đã đề cập trước đó trong hướng dẫn, mã hóa Base64 cũng sử dụng các ký tự
Content-Type: text/plain; charset=UTF-800 và
Content-Type: text/plain; charset=UTF-801 bên cạnh các giá trị chữ và số thông thường. Tuy nhiên, những ký tự này có ý nghĩa đặc biệt trong URL. Điều này có nghĩa là giá trị được mã hóa Base64 sử dụng các ký tự này có thể dẫn đến hành vi không mong muốn nếu được sử dụng bên trong URL
Một giải pháp cho vấn đề này là sử dụng các hàm
Content-Type: text/plain; charset=UTF-843 và
Content-Type: text/plain; charset=UTF-844 để mã hóa và giải mã bất kỳ dữ liệu nào. Các chức năng này thay thế
Content-Type: text/plain; charset=UTF-800 bằng
Content-Type: text/plain; charset=UTF-846 và
Content-Type: text/plain; charset=UTF-801 bằng
Content-Type: text/plain; charset=UTF-848 trong quá trình mã hóa
Đây là một ví dụ trong Python cho thấy sự khác biệt này
1
2KfZhNiz2YTYp9mFINi52YTZitmD2YUg2YjYsdit2YXYqSDYp9mE2YTZhyDZiNio2LHZg9in2KrZ2
2___
3
59_______23__________
h9iMDQoNCtij2YjYryDZgdmC2Lcg2KfZhNin2LPYqtmB2LPYp9ixINi52YYg2KfZhNmF2YLYsdix1
5
626_______4
Content-Type: text/plain; charset=UTF-81
h9iMDQoNCtij2YjYryDZgdmC2Lcg2KfZhNin2LPYqtmB2LPYp9ixINi52YYg2KfZhNmF2YLYsdix6
Content-Type: text/plain; charset=UTF-83
Content-Type: text/plain; charset=UTF-85
h9iMDQoNCtij2YjYryDZgdmC2Lcg2KfZhNin2LPYqtmB2LPYp9ixINi52YYg2KfZhNmF2YLYsdix9
Content-Type: text/plain; charset=UTF-87
61
Content-Type: text/plain; charset=UTF-89
21_______1_______4_______20_______3_______1_______
Học Python
Tìm hiểu Python với hướng dẫn hướng dẫn Python hoàn chỉnh của chúng tôi, cho dù bạn mới bắt đầu hay bạn là một lập trình viên dày dặn đang tìm cách học các kỹ năng mới
Bài đăng này đã được cập nhật với sự đóng góp từ Nitish Kumar. Nitish là nhà phát triển web có kinh nghiệm tạo trang web Thương mại điện tử trên nhiều nền tảng khác nhau. Anh ấy dành thời gian rảnh của mình để thực hiện các dự án cá nhân giúp cuộc sống hàng ngày của anh ấy dễ dàng hơn hoặc đi dạo buổi tối dài với bạn bè