Giải Mã & Mã Hóa Base64: Sang PDF, Ảnh hoặc Tệp

Giải mã Base64 online: dán mã Base64 để lấy lại tệp PDF, ảnh, văn bản hay JWT, hoặc thả tệp vào để có Base64 của nó. Mọi thứ diễn ra ngay trong tab này.

Nhận diện 33 định dạng tệp từ chính byte của chúng · RFC 4648 · không tải gì lên
Đã mã hóa

Dán nội dung vào ô phía trên, thả tệp lên khung, hoặc bấm một ví dụ.

Thử

Mọi thứ ở lại trong tab này: không gì bạn dán hay thả vào bị tải lên, và HTML hay script giải mã ra chỉ hiện dưới dạng văn bản, không bao giờ được chạy.

3 byte → 4 ký tự
Ví dụ: Man
M77 · 4DByte 1
a97 · 61Byte 2
n110 · 6EByte 3
1922546

Ba byte là 24 bit. Base64 cắt chính 24 bit đó thành bốn nhóm sáu bit, và mỗi nhóm chỉ đến một trong 64 ký tự. Các vạch trắng là chỗ các byte kết thúc: chúng không thẳng hàng với các nhóm, và đó là toàn bộ bí quyết.

Ký tự 1

16 + 2 + 1 = 19 T

Chỉ số 19 trong bảng chữ cái chuẩn.

1chỗ một byte kết thúcthêm vào, không phải của bạnkhác trong bảng an toàn cho URLTrỏ vào một ký tự để xem sáu bit của nó cộng lại.

Cách dùng công cụ giải mã và mã hóa Base64

Dán bất cứ thứ gì vào ô nhập duy nhất (văn bản, Base64, cả một data: URI hoặc một JWT), hoặc bấm Chọn tệp hay thả tệp lên khung. Công cụ tự xác định chiều chuyển đổi, ghi rõ trên nhãn, và để cách đọc còn lại chỉ cách một cú bấm.

Khi giải mã một tệp, bạn nhận được kiểu tệp đọc từ chính các byte, dung lượng, kích thước điểm ảnh của ảnh, thẻ Xem trước cho ảnh hoặc PDF, và bản tải về với đúng phần mở rộng. Khi mã hóa một tệp, bạn nhận được Base64, một data: URI dùng ngay được và mức dung lượng mà việc mã hóa tốn thêm. Các tùy chọn Bảng chữ cái, Phần đệm và Ngắt dòng bên dưới kết quả thay đổi đầu ra.

Giải mã Base64: chuỗi Base64 được giải mã thành tài liệu PDF, kèm kiểu tệp, dung lượng và hình 3 byte thành 4 ký tựGiải mã Base64: chuỗi Base64 được giải mã thành tài liệu PDF, kèm kiểu tệp, dung lượng và hình 3 byte thành 4 ký tựMột ô, cả hai chiềuDán văn bản, Base64, data: URI hoặc JWT. Nhãn cho biết nội dung được đọc theo cách nào; menu cho phép đổi lại.Chọn tệpHoặc thả tệp vào bất kỳ đâu trên khung: tệp trở thành Base64 và một data: URI mà không rời khỏi tab.Các byte là gìKhi giải mã, kết quả mở đầu bằng kiểu tệp, dung lượng và chữ ký tệp, rồi đến bản xem trước và nút tải về.Tùy chọn đầu raBảng chữ cái chuẩn hoặc an toàn cho URL, bật hoặc tắt phần đệm, và ngắt dòng cho MIME hoặc PEM.3 byte → 4 ký tựChính các byte của bạn, được cắt lại thành từng nhóm sáu bit. Trỏ vào một ký tự để xem các bit của nó cộng lại.
Công cụ đang giải mã một tệp PDF. Chọn một số để xem từng phần làm gì.

Base64 là gì, và vì sao nó tồn tại?

Base64 viết mọi byte bằng 64 ký tự đi qua được mọi nơi: A–Z, a–z, 0–9, + và /. Nó tồn tại vì email, URL, JSON và XML được tạo ra cho văn bản, còn một byte thô có thể là mã điều khiển, dấu ngoặc kép hoặc ký tự null làm hỏng chúng.

Nó lấy ba byte một lần, xếp 24 bit của chúng thành một hàng rồi cắt hàng đó thành bốn nhóm sáu bit. Sáu bit chứa được 64 giá trị, nên mỗi nhóm chỉ đúng một ký tự. Ba byte vào, bốn ký tự ra, lần nào cũng vậy: đó là lý do Base64 lớn hơn dữ liệu gốc khoảng một phần ba.

Man → TWFu
M77 · 4DByte 1
a97 · 61Byte 2
n110 · 6EByte 3
1922546TWFu

Ba byte là 24 bit. Base64 cắt lại chúng thành bốn nhóm sáu bit, và mỗi nhóm chỉ đến một trong 64 ký tự in được, nên ba byte luôn tốn bốn ký tự. Mức tăng 33% đến từ chính chỗ đó.

Ma → TWE=
M77 · 4DByte 1
a97 · 61Byte 2
không có byte—Byte 3
19224—TWE=

Hai byte là 16 bit. Base64 thêm 2 bit 0 để hoàn tất nhóm thứ ba, và một dấu = đứng ở chỗ lẽ ra là ký tự thứ tư.

M → TQ==
M77 · 4DByte 1
không có byte—Byte 2
không có byte—Byte 3
1916——TQ==

Một byte là 8 bit. Base64 thêm 4 bit 0 để hoàn tất nhóm thứ hai, và hai dấu = đứng ở chỗ lẽ ra là ký tự thứ ba và thứ tư. = hoàn toàn không mang bit nào.

Các vạch trắng đánh dấu chỗ một byte kết thúc và byte tiếp theo bắt đầu. Chúng không thẳng hàng với các nhóm sáu bit, và độ lệch đó chính là toàn bộ cơ chế. Nguồn: RFC 4648 §4

Làm sao giải mã Base64 sang PDF?

Dán chuỗi vào và công cụ dựng lại tệp PDF: nó hiển thị phiên bản và dung lượng, mở tài liệu trong trình xem PDF có sẵn của trình duyệt và cho bạn nút tải về. Bạn không cần nói đó là PDF, cũng không cần xóa tiền tố data: trước.

Tệp PDF được nhận ra nhờ năm byte đầu tiên, %PDF-, nên tệp vẫn được xác định đúng ngay cả khi tên tệp, kiểu mà bên gửi khai báo hay trường dữ liệu chứa nó nói khác đi. Nếu các byte không phải PDF, trang sẽ cho biết chúng là gì thay vì cố mở một tài liệu vốn không hề có.

Tệp được dựng lại ngay trong trình duyệt của bạn. Không gì bị tải lên, điều này quan trọng khi tệp PDF là phiếu lương, hợp đồng hay hóa đơn.

JSON từ một API"document": "JVBERi0xLjcKJeLjz9MKMS…"Một trường trong phản hồi. Dấu ngoặc kép không thuộc về Base64.
Tệp đính kèm emailContent-Transfer-Encoding: base64MIME ngắt phần thân thành các dòng 76 ký tự. Hãy dán nguyên cả dấu ngắt dòng: chúng sẽ được bỏ qua.
Một data: URIdata:application/pdf;base64,JVBERi0x…Dán nguyên cả chuỗi. Tiền tố được đọc, không cần tự tay cắt bỏ.
Các byte đầu tiên cho biết đó là gì
  1. 25%
  2. 50P
  3. 44D
  4. 46F
  5. 2D-
  6. 311
  7. 2E.
  8. 377

5 byte đầu tiên, %PDF-, là toàn bộ chữ ký tệp. Byte 6 đến 8 là phiên bản: 1.7. Phần mở rộng tệp không đóng vai trò gì, nên một tệp PDF bị ai đó đặt tên .txt vẫn được trả lại đúng là PDF.

Ba nơi người ta thường sao chép một tệp PDF dạng Base64, và các byte nhận diện nó sau khi giải mã. Nguồn: ISO 32000-1:2008 §7.5.2, RFC 8118 §8

Làm sao chuyển ảnh sang Base64, và khi nào nên làm?

Thả ảnh vào và bạn nhận được Base64 của nó cùng một data: URI dùng ngay được để dán vào HTML hoặc CSS. Có nên làm hay không mới là câu hỏi khó hơn: Base64 luôn tốn thêm khoảng một phần ba, và ảnh nhúng trực tiếp không thể được lưu vào bộ nhớ đệm riêng.

Theo chiều ngược lại, từ Base64 sang ảnh, bạn nhận được định dạng, dung lượng và kích thước điểm ảnh thật đọc từ header của chính tệp, không phải từ hình trên màn hình, cùng nút tải về với đúng phần mở rộng.

  • Tệp trên ổ đĩa12,9 kB 100%
  • Dưới dạng Base6417,3 kB +33,4%
  • Ngắt dòng ở 76 ký tự cho MIME17,5 kB +35,1%
  • Tệp, nén gzip11,7 kB -9,5%
  • Base64, nén gzip12,5 kB -3,2%
Một tệp thật
  • chỉ tải về một lần
  • được trình duyệt và CDN lưu vào bộ nhớ đệm
  • được tải riêng bên cạnh trang, không nằm bên trong trang
Cùng ảnh đó, nhúng trực tiếp
  • lớn hơn một phần ba trước khi nén
  • chỉ được lưu đệm như một phần của tệp chứa nó
  • được phân tích như một phần của stylesheet hoặc HTML

Nén lấy lại được phần lớn: sau khi nén gzip, Base64 chỉ lớn hơn tệp nén gzip 7%. Thứ nén không trả lại được là mục bộ nhớ đệm riêng của ảnh: khi nhúng vào một trang HTML, ảnh bị tải lại cùng mỗi trang chứa nó.

Nguyên tắc dễ nhớ: nhúng trực tiếp vài trăm byte (một biểu tượng, một ảnh đệm, một logo trong email) và dùng liên kết cho mọi thứ lớn hơn. Ảnh PNG 12,9 kB này đã vượt ngưỡng đó.

Đo trên chính ảnh mà ví dụ của công cụ giải mã ra: cùng các byte đó, mang đi theo năm cách, nén gzip ở mức cao nhất. Nguồn: RFC 2045 §6.8

Base64 và Base64 an toàn cho URL (URL-safe): khác nhau thế nào?

Base64 an toàn cho URL (RFC 4648 §5) là cùng một cách mã hóa nhưng đổi hai ký tự: + thành - và / thành _. Phần đệm cũng thường bị bỏ đi.

Hãy dùng nó ở bất cứ đâu kết quả đi vào URL, tên tệp hay cookie. JSON Web Token dùng nó cho mọi phần, vì vậy các phần của một token không bao giờ kết thúc bằng =. Công cụ này đọc được cả hai bảng chữ cái và báo cho bạn khi một chuỗi chứa cả hai.

Chuẩn (RFC 4648 §4)+/8=
An toàn cho URL (RFC 4648 §5)-_8=
base64url trong JWT (RFC 7515 §2)-_8
  • + → -Chỉ số 62. Trong chuỗi truy vấn, bộ giải mã form đọc + thành dấu cách, nên dữ liệu bị sai.
  • / → _Chỉ số 63. Trong đường dẫn, / mở đầu một đoạn mới, nên giá trị bị tách làm hai.
  • Bỏ =Trong URL, = thường được mã hóa phần trăm thành %3D (RFC 4648 §5). JWT bỏ hẳn nó (RFC 7515 §2): chỉ riêng độ dài đã cho biết các byte kết thúc ở đâu.

62 ký tự đầu tiên của hai bảng chữ cái giống hệt nhau, vì vậy một công cụ đọc được cả hai bảng chữ cái có thể giải mã chuỗi viết bằng bảng nào cũng được, và vì vậy trang này báo cho bạn khi một chuỗi chứa cả hai.

Chỉ 2 ký tự khác nhau giữa hai bảng chữ cái. Mọi thứ khác ở chúng đều giống nhau. Nguồn: RFC 4648 §5, RFC 7515 §2

Base64 có phải là mã hóa bảo mật không? Không.

Base64 không che giấu gì cả. Không có khóa, không có bí mật, và đảo ngược nó chẳng tốn chút công sức nào: một công cụ giải mã như công cụ này làm việc đó ngay khi bạn gõ.

Xác thực HTTP Basic là nơi điều này quan trọng nhất: header mang tên người dùng và mật khẩu dưới dạng một chuỗi Base64, ai nhìn thấy cũng đọc được, vì vậy RFC 7617 chỉ coi nó là an toàn khi đi qua một kết nối được mã hóa như TLS. Nếu thứ gì đó phải được giữ kín, nó cần mã hóa bảo mật (encryption). Base64 chỉ giúp các byte đi qua an toàn một kênh được tạo ra cho văn bản.

Một header Authorization, theo cách RFC 7617 §2 tạo ra nó

Authorization: Basic dXNlcjpwYXNzd29yZA==

Một bước ngược lại: không cần khóa, không cần mật khẩu

user:password

RFC 7617 tạo header từng bước, và bước cuối cùng là toàn bộ sự “bảo vệ” của nó: client “thu được basic-credentials bằng cách mã hóa chuỗi octet này bằng Base64”. §1 của RFC nói rõ điều đó nghĩa là gì: trừ khi TLS hoặc một hệ thống tương tự bảo vệ kết nối, “user-id và mật khẩu được truyền qua mạng dưới dạng bản rõ”. Base64 không có khóa, nên chẳng có gì để phá: ai có chuỗi này là có mật khẩu.

Thông tin đăng nhập ở trên là bịa ra. Đọc ngược lại chúng chỉ mất một bước và không cần khóa: đó là ý nghĩa của “mã hóa dữ liệu (encoding), không phải mã hóa bảo mật (encryption)”. Nguồn: RFC 7617 §2, §1

Vì sao văn bản giải mã ra bị lỗi bảng mã (mojibake)?

Vì Base64 mang byte, và byte chỉ trở thành chữ khi có thứ gì đó chọn một bảng mã ký tự. Đọc văn bản UTF-8 như thể nó là ISO-8859-1 thì é biến thành é; đọc ISO-8859-1 như UTF-8 thì nó thành một dấu thay thế.

Một data: URI có thể khai báo charset, và trang này đọc văn bản theo đúng charset đó thay vì ép mọi thứ qua UTF-8. Khi trình duyệt của bạn không có bộ giải mã cho bảng mã được khai báo, trang sẽ nói rõ điều đó thay vì lặng lẽ hiển thị sai chữ.

“Café” viết bằng UTF-8436166C3A9
“Café” viết bằng ISO-8859-1436166E9

Trong UTF-8, é là 2 byte; trong ISO-8859-1, nó là 1 byte. Base64 mang byte, không mang chữ, nên bản thân chuỗi không thể cho bộ giải mã biết bảng mã nào mới đúng.

Đọc đúng cáchCafé
Byte UTF-8 đọc theo ISO-8859-1Café
Byte ISO-8859-1 đọc theo UTF-8Caf�
Mojibake (lỗi bảng mã) có hai dạng: chữ đọc được nhưng vô nghĩa (Café) khi UTF-8 bị đọc theo một trang mã một byte, và dấu thay thế (Caf�) khi các byte hoàn toàn không phải UTF-8 hợp lệ. Nguồn: RFC 4648 §4, RFC 2397 §4

Base64 trong Python, JavaScript, Java, C#, Go, PowerShell và shell

Ngôn ngữ nào cũng có sẵn Base64. Cái bẫy thì ở đâu cũng giống nhau: hãy mã hóa byte chứ không phải chuỗi, và nói rõ văn bản dùng bảng mã ký tự nào.

btoa() của JavaScript là chỗ dễ vấp nhất: nó chỉ nhận ký tự đến U+00FF, nên mọi thứ vượt ngoài Latin-1 phải được chuyển thành byte UTF-8 bằng TextEncoder trước. Mỗi ví dụ dưới đây mã hóa và giải mã “Man”, và đều đã được chạy để kiểm tra kết quả.

import base64

b64 = base64.b64encode("Man".encode("utf-8")).decode("ascii")
print(b64)                                    # TWFu
print(base64.b64decode(b64).decode("utf-8"))  # Man

Đã chạy bằng Python 3.14.4 vào 26 tháng 10, 2026: kết quả in ra đúng như phần chú thích.

Mọi đoạn mã đều đã được chạy với “Man” và in ra đúng như phần chú thích của nó. base64 -d của shell là -D trên các bản macOS cũ. Nguồn: gnu.org, developer.mozilla.org

Bảng chữ cái Base64, từ 0 đến 63

Mỗi nhóm sáu bit là một số từ 0 đến 63, và đây là bảng để tra số đó. Base64 phân biệt chữ hoa chữ thường: A là 0 còn a là 26, nên đổi hoa thường của một chữ cái sẽ làm hỏng chuỗi.

Bảng này đáng để nhận ra bằng mắt: một dãy A là một dãy byte 0, và một chuỗi Base64 bắt đầu bằng JVBER là tệp PDF, iVBOR là PNG, còn /9j/ là JPEG.

  1. A0
  2. B1
  3. C2
  4. D3
  5. E4
  6. F5
  7. G6
  8. H7
  9. I8
  10. J9
  11. K10
  12. L11
  13. M12
  14. N13
  15. O14
  16. P15
  17. Q16
  18. R17
  19. S18
  20. T19
  21. U20
  22. V21
  23. W22
  24. X23
  25. Y24
  26. Z25
  27. a26
  28. b27
  29. c28
  30. d29
  31. e30
  32. f31
  33. g32
  34. h33
  35. i34
  36. j35
  37. k36
  38. l37
  39. m38
  40. n39
  41. o40
  42. p41
  43. q42
  44. r43
  45. s44
  46. t45
  47. u46
  48. v47
  49. w48
  50. x49
  51. y50
  52. z51
  53. 052
  54. 153
  55. 254
  56. 355
  57. 456
  58. 557
  59. 658
  60. 759
  61. 860
  62. 961
  63. +An toàn cho URL: -62
  64. /An toàn cho URL: _63

0–25 là A–Z, 26–51 là a–z, 52–61 là 0–9. Chỉ hai ký tự cuối của bảng khác nhau giữa hai bảng chữ cái, được đánh dấu ở trên. = hoàn toàn không có trong bảng: nó không phải một giá trị, mà là dấu cho biết nhóm ba byte cuối cùng bị thiếu.

64 ký tự, theo đúng thứ tự RFC 4648 §4 đưa ra. Con số bên dưới mỗi ký tự là giá trị sáu bit mà nó đại diện. Nguồn: RFC 4648 §4

Base64: hỏi và đáp

Base64 là gì, và giải mã Base64 là gì?

Base64 viết mọi byte bằng 64 ký tự đi qua được mọi nơi. Giải mã Base64 biến mỗi nhóm bốn ký tự trở lại thành ba byte mà nó đại diện. Các byte đó có thể là văn bản, hoặc cả một tệp như PDF, ảnh PNG hay tệp nén ZIP. Công cụ này đọc các byte đầu tiên để biết đó là gì, rồi hiển thị chính văn bản hoặc tệp thay vì một màn hình đầy ký hiệu, và cho bạn tải về.

Làm sao giải mã một tệp Base64?

Để dịch mã Base64 thành tệp, hãy dán chuỗi vào ô nhập. Công cụ giải mã nó, đối chiếu các byte đầu tiên với các chữ ký tệp mà nó biết (tổng cộng 33 định dạng tệp), gọi tên định dạng, xem trước ảnh hoặc PDF, và cho bạn tải về với đúng phần mở rộng. Bạn không bao giờ phải nói đó là loại tệp gì, và không gì bị tải lên để tìm ra điều đó.

Base64 dùng để làm gì?

Nó đưa byte đi qua những nơi được tạo ra cho văn bản: tệp đính kèm email (MIME), data: URI trong HTML và CSS, các trường nhị phân trong JSON và XML, JSON Web Token, xác thực HTTP Basic, cùng chứng chỉ và khóa trong tệp PEM. Ở mỗi trường hợp, dữ liệu phải đi qua một kênh có thể làm thay đổi hoặc đánh rơi byte thô, nên nó được truyền đi dưới dạng chữ cái và chữ số thông thường.

Base64 có phải là mã hóa bảo mật không?

Không. Base64 là một cách mã hóa dữ liệu (encoding), không phải mật mã (cipher): nó không có khóa, không có bí mật, và ai cũng đảo ngược được trong chớp mắt, như trang này làm ngay khi bạn gõ. Hãy coi mọi thứ viết bằng Base64 như đang phơi ra trước mắt mọi người. Nếu dữ liệu phải được giữ kín, hãy mã hóa bảo mật nó trước, rồi mới chuyển các byte đã mã hóa bảo mật sang Base64 nếu chúng phải đi dưới dạng văn bản.

Giải mã Base64 online có an toàn không?

Trên trang này thì có, và bạn có thể tự kiểm tra: mọi thứ được giải mã bằng JavaScript ngay trong tab trình duyệt của bạn, và không gì bạn dán hay thả vào bị tải lên. HTML, SVG và script giải mã ra chỉ hiện dưới dạng văn bản, không bao giờ được chạy; ảnh hoặc PDF được hiển thị bằng trình xem có sẵn của trình duyệt. Hãy mở thẻ Mạng (Network) trong công cụ dành cho nhà phát triển khi dùng: không yêu cầu nào mang dữ liệu của bạn.

Vì sao Base64 lớn hơn bản gốc 33%?

Vì cứ ba byte lại thành bốn ký tự, và bốn chia ba là 1,33. Có thể thêm tối đa hai ký tự đệm = ở cuối, và việc ngắt dòng ở 76 ký tự cho email thêm một dấu ngắt dòng vào mỗi dòng, nên một chuỗi dài thường lớn hơn khoảng 35% so với các byte nó mang. Nén như gzip lấy lại được phần lớn mức chênh đó.

Base64 an toàn cho URL (URL-safe) là gì?

Đó là Base64 với + được thay bằng - và / được thay bằng _, như RFC 4648 §5 định nghĩa, để kết quả có thể đi vào URL, tên tệp hay cookie mà không cần thoát ký tự. Phần đệm thường cũng bị bỏ, như trong JSON Web Token. Công cụ này đọc được cả hai bảng chữ cái, kể cả khi chúng lẫn trong cùng một chuỗi, và có thể viết theo bảng nào cũng được.

Vì sao giải mã Base64 bị lỗi?

Hầu như luôn do một ký tự không nằm trong bảng chữ cái Base64: dấu chấm lửng nơi ứng dụng chat cắt chuỗi, dấu ngoặc kép cong từ trình soạn thảo văn bản, hoặc dấu cách không ngắt từ tệp PDF. Công cụ này gọi tên ký tự đó, chỉ ra nó nằm ở đâu kèm vị trí, cho biết bao nhiêu dữ liệu đã giải mã trơn tru trước nó, và đề nghị xóa nó đi khi phần còn lại vẫn giải mã được.

Có chuyển Base64 sang ảnh được không?

Được. Dán chuỗi vào, có hay không có tiền tố như data:image/png;base64, đều được, và ảnh hiện ra kèm định dạng, dung lượng và kích thước điểm ảnh thật đọc từ header của chính tệp. Sau đó tải ảnh về với đúng phần mở rộng. PNG, JPEG, GIF, WebP, BMP, ICO và AVIF đều xem trước được; SVG được hiển thị dưới dạng văn bản trước, vì SVG có thể chứa script.

Dấu = ở cuối Base64 nghĩa là gì?

Nó có nghĩa là nhóm ba byte cuối cùng bị thiếu. Hai byte còn lại trở thành ba ký tự và một =, còn một byte còn lại trở thành hai ký tự và ==. Phần đệm hoàn toàn không mang dữ liệu: nó chỉ cho bộ giải mã biết các byte kết thúc ở đâu. Nhiều bộ giải mã, kể cả công cụ này, cũng đọc được Base64 đã bị bỏ phần đệm.

Có giới hạn dung lượng không?

Tệp bạn chọn hoặc thả vào có thể lớn tối đa 10 MB; tệp lớn hơn sẽ bị từ chối kèm tên và dung lượng, không bao giờ bị đọc dở một nửa. Giới hạn cho văn bản dán vào là 14.349.002 ký tự: đủ cho Base64 của một tệp 10 MB kèm các dấu ngắt dòng, nên mọi thứ công cụ mã hóa ra đều giải mã lại được. Dữ liệu lớn được đọc ở chế độ nền, nên việc gõ vẫn mượt.

Có giải mã JWT ở đây được không?

Được. Dán token vào và header cùng payload của nó được in ra dưới dạng JSON đã định dạng, có ngày tháng hiện bên cạnh các claim iat và exp, còn chữ ký hiện dưới dạng byte. Trang này chỉ giải mã ba phần base64url: nó không xác minh chữ ký và không bao giờ nói một token là hợp lệ, nên đừng dùng nó để quyết định có nên tin một token hay không.

Còn thiếu điều gì?Đề xuất tính năng hoặc công cụ mới