Tại sao chỉ base64 thay vì base128 được sử dụng để truyền dữ liệu nhị phân trên web? Bộ ký tự ASCII có 128 ký tự mà theo lý thuyết có thể đại diện cho cơ sở 128, nhưng chỉ base64 chứ không phải base128 được sử dụng trong hầu hết các trường hợp.
Tại sao chỉ base64 thay vì base128 được sử dụng để truyền dữ liệu nhị phân trên web? Bộ ký tự ASCII có 128 ký tự mà theo lý thuyết có thể đại diện cho cơ sở 128, nhưng chỉ base64 chứ không phải base128 được sử dụng trong hầu hết các trường hợp.
Câu trả lời:
Vấn đề là ít nhất 32 ký tự của bộ ký tự ASCII là 'ký tự điều khiển' có thể được thông dịch bởi thiết bị đầu cuối nhận. Ví dụ: có ký tự BEL (chuông) làm cho thiết bị đầu cuối nhận kêu vang. Có các ký tự SOT (Start Of Transmission) và EOT (End Of Transmission) thực hiện chính xác những gì tên của chúng ngụ ý. Và đừng quên các ký tự CR và LF, có thể có ý nghĩa đặc biệt trong cách cấu trúc dữ liệu được tuần tự hóa / làm phẳng thành một luồng.
Adobe đã tạo mã hóa Base85 để sử dụng nhiều ký tự hơn trong bộ ký tự ASCII, nhưng AFAIK nó được bảo vệ bởi các bằng sáng chế.
Bởi vì một số trong số 128 ký tự đó không thể in được (chủ yếu là những ký tự nằm dưới điểm mã 0x20). Do đó, chúng không thể được truyền đi một cách đáng tin cậy như một chuỗi trên dây. Và, nếu bạn vượt lên trên codepoint 128, bạn có thể gặp sự cố mã hóa do các mã hóa khác nhau được sử dụng trên các hệ thống.
Như đã nêu trong các câu trả lời khác, điểm mấu chốt là giảm bộ ký tự thành những bộ có thể in được. Một lược đồ mã hóa hiệu quả hơn là basE91 vì nó sử dụng bộ ký tự lớn hơn và vẫn tránh các ký tự kiểm soát / khoảng trắng trong phạm vi ASCII thấp. Trang web có một so sánh tuyệt vời về hiệu quả mã hóa nhị phân so với base64 và basE91 .
Tôi đã từng làm sạch việc triển khai Java. Nếu mọi người quan tâm, tôi có thể đẩy nó lên GitHub.
Cập nhật : Hiện đã có trên GitHub .
32 ký tự đầu tiên là ký tự điều khiển hoàn toàn không liên quan, bởi vì bạn không cần phải sử dụng chúng để có 128 ký tự. Chúng tôi có 256 ký tự để lựa chọn và chỉ 32 ký tự đầu tiên là ký tự điều khiển. Điều đó để lại 192 ký tự, và do đó 128 là hoàn toàn có thể thực hiện được mà không cần sử dụng các ký tự điều khiển.
Đây là lý do: Nó phải là thứ trông giống nhau và bạn có thể sao chép và dán, bất kể ở đâu. Vì nó phải là các ký tự sẽ được hiển thị giống nhau trên bất kỳ diễn đàn, trò chuyện, email nào, v.v. Điều đó có nghĩa là chúng tôi không thể sử dụng các ký tự mà một diễn đàn / trò chuyện / ứng dụng email thường có thể sử dụng để định dạng hoặc bỏ qua. Nó cũng phải là các ký tự giống nhau, bất kể cài đặt phông chữ, ngôn ngữ và khu vực.
Đó là lý do!
Base64 phổ biến vì nó giải quyết được nhiều vấn đề (hoạt động gần như ở mọi nơi bạn có thể nghĩ đến)
Bạn không cần phải lo lắng liệu phương tiện vận chuyển có sạch 8-bit hay không.
Tất cả các ký tự trong bảng mã đều có thể in được. Bạn có thể nhìn thấy chúng. Bạn có thể sao chép và dán chúng. Bạn có thể sử dụng chúng trong các URL (các biến thể cụ thể). Vân vân.
Kích thước mã hóa cố định. Bạn biết rằng m
byte luôn có thể mã hóa thành n
byte.
Mọi người đều đã nghe về nó - nó được hỗ trợ rộng rãi, rất nhiều thư viện, rất dễ tương tác.
Base128 không có tất cả những ưu điểm đó.
Có vẻ như nó sạch sẽ 8-bit - nhưng hãy nhớ lại rằng base64 sử dụng 65 ký hiệu. Nếu không có một ký tự nằm ngoài dải, bạn không thể có lợi ích của kích thước mã hóa cố định. Nếu bạn sử dụng một ký tự ngoài dải, bạn không thể sạch 8-bit nữa.
Tuy nhiên, nó không phải là tất cả tiêu cực.
base128 dễ mã hóa / giải mã hơn base64 - bạn chỉ cần sử dụng ca và mặt nạ. Có thể quan trọng đối với các triển khai nhúng
base128 sử dụng truyền tải hiệu quả hơn một chút so với base64 bằng cách sử dụng nhiều bit có sẵn hơn.
Người làm sử dụng base128 - Tôi đang sử dụng nó cho một cái gì đó ngay bây giờ. Nó chỉ là không phổ biến.
Không chắc chắn, nhưng tôi nghĩ rằng các giá trị thấp hơn (đại diện cho mã điều khiển hoặc thứ gì đó) không được chuyển một cách đáng tin cậy dưới dạng văn bản / ký tự bên trong HTTP-request / response và các giá trị trên 127 có thể là ngôn ngữ / codepage / bất cứ điều gì cụ thể, vì vậy không có 128 ký tự khác nhau có thể hoạt động trên tất cả các trình duyệt / nền tảng.
esaji đúng. Base64 được sử dụng để mã hóa dữ liệu nhị phân để truyền bằng giao thức chỉ mong đợi văn bản. Nó nằm ngay trong mục Wiki .
Kiểm tra PHP-Class base128. Mã hóa và giải mã với bộ ký tự ISO 8859-1.