Tại sao base128 không được sử dụng? [đóng cửa]


90

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.


60
Tại sao thậm chí không cơ sở 256?
Gumbo

22
Tôi nghĩ điểm mấu chốt là phải có in ký tự (mặc dù cũng có hơn 64 ...)
Felix Kling

29
Tôi nghĩ rằng căn cứ 128 đã thuộc về chúng tôi một lúc trước. Đội được giao nhiệm vụ canh gác căn cứ 64 vẫn đang cầm cự.
Ritch Melton

5
tại sao câu hỏi này là javascript cụ thể? điều này cũng đúng với hầu hết các ngôn ngữ khác được sử dụng trên web, phải không?
Benedikt Waldvogel

5
@KenRockot: Tôi thấy bạn nhận ra rằng một số ký tự 15 bit của bạn sẽ được mã hóa thành 3 byte. Mã hóa base-2048 của bạn có nghĩa là đóng gói 11 bit thành 2 byte, tạo ra 5,5 bit trên mỗi byte - ít hơn một nửa so với base-64.
maaartinus

Câu trả lời:


105

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ế.


7
Base91 có vẻ như là một lựa chọn tốt mã nguồn mở: base91.sourceforge.net
Jorge Cevallos

2
Đáng xem xét rằng sức mạnh của 2 phù hợp với dữ liệu byte dễ dàng hơn và mã hóa đơn giản hơn. Sau đó, có tính di động; mọi ngôn ngữ đều có mã hóa base64 và / hoặc giải mã base64.
Lodewijk

5
Re Base85 và Adobe : câu trả lời có thể hữu ích hơn nếu nó trích dẫn số bằng sáng chế và năm được cấp. Nếu các bằng sáng chế là một vấn đề thì luôn có btoa, có từ năm 1990, không bị cản trở bởi các bằng sáng chế, và những bằng sáng chế đó chắc chắn sẽ hết hạn.
agc

65

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.


8
Base94 tồn tại ở đây trong github, nó sử dụng tất cả 94 ký tự ASCII in: gist.github.com/iso2022jp/4054241
intrepidis

15

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 .


Tôi muốn được quan tâm trong phiên bản java
Michael Deardeuff


12

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!


7
Các ký tự điều khiển có liên quan bởi vì hầu hết mọi người đều đã giả định quan điểm của bạn rằng nó phải càng trung lập về mã hóa / mã hóa càng tốt. Điều đó nhất thiết hạn chế bạn chỉ ASCII (7-bit) là một tập hợp con của hầu hết các mã hóa có liên quan. Ngoài ra, không phải tất cả Internet đều sạch 8-bit, và phần lớn là defacto ASCII. Tuy nhiên, quan điểm của bạn rất đáng để làm.
Tim Seguine

7
Chỉ cần thêm: ASCII chỉ xác định 128 ký tự. Các ký tự # 128 đến # 255 không được định nghĩa trong ASCII. Vì câu hỏi tham chiếu rõ ràng đến ASCII chứ không phải "bất kỳ mã hóa 8 bit nào", tất cả các câu trả lời tự giới hạn trong 128 ký tự của bộ ASCII.
pepoluan

Sử dụng mã hóa UTF-8 phổ biến nhất làm ví dụ: Các byte ở 128 đến 196 sẽ ngay lập tức dẫn đến lỗi giải mã UTF8; byte ở 196 đến 256 sẽ ngụ ý rằng byte tiếp theo cũng có cùng ký tự, nhưng nếu byte tiếp theo dưới 128, nó sẽ lại dẫn đến lỗi giải mã UTF8. Tuy nhiên, hầu hết tất cả các ngôn ngữ nhạy cảm với mã hóa ký tự sẽ có thư viện base64 lấy chuỗi base64 làm chuỗi UTF8 an toàn. Điều tương tự không thể được thực hiện với base128 vì nó không thể được mã hóa thành một chuỗi UTF8 an toàn.
SOFe

10

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 mbyte luôn có thể mã hóa thành nbyte.

  • 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.


Cũng nên nhớ rằng hệ thống thư / tin tức và ilk của chúng (và cả XML) không phải lúc nào cũng tốt với 32 mã điểm đầu tiên (ví dụ: hãy xem xét CR LF và LF), nhưng nếu không thì câu trả lời của bạn trông rất hay.
SamB

"base64 đó sử dụng 65 ký hiệu." => lỗi đánh máy hoặc tôi đã bỏ sót điều gì đó?
Kikiwa

@Kikiwa, hãy xem mẫu java này trên wikipedia . Kiểm tra độ dài của CODESbiến.
John La Rooy

Ồ vâng, ký tự đệm '=' chỉ ở cuối tải trọng mã hóa, bạn nói đúng, cảm ơn.
Kikiwa

4

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.


3

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 .


2

Kiểm tra PHP-Class base128. Mã hóa và giải mã với bộ ký tự ISO 8859-1.

GoogleCode PHP-Class Base128


1
tôi muốn nó được sử dụng utf-8 thay vì ...
Janus Troelsen

1
Mã hóa cơ sở không liên quan gì đến dữ liệu cơ bản. Bạn có thể sử dụng bất kỳ mã hóa văn bản nào mà bạn muốn để mã hóa văn bản / dữ liệu của mình. Ý của anh ấy là bảng chỉ số Base ## sử dụng bộ ký tự ISO 8859-1 ASCII làm bản dịch.
Chad

1
Nó có liên quan gì đó đến dữ liệu cơ bản ngay khi bạn cố gắng nhúng dữ liệu nhị phân được mã hóa cơ sở vào văn bản. Nếu văn bản đó được mã hóa trong một bảng mã khác, bạn sẽ gặp sự cố.
Stijn de Witt

Không có cái gọi là bộ ký tự "ISO 8859-1 ASCII". Chương trình mã hóa dữ liệu bằng 128 ký tự ISO 8859-1 có thể in khác nhau. Nó không sử dụng ASCII , theo bất kỳ cách nào, hình dạng hoặc hình thức nào.
Nisse Engström
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.