De ce nu se folosește baza128? [închis] (Programare, Codificare, Agnostic De Limbă, Binar)

gmadar a intrebat.

De ce se folosește doar base64 în loc de base128 pentru a transmite date binare pe web? Setul de caractere ASCII are 128 de caractere care, în teorie, ar putea reprezenta baza 128, dar în majoritatea cazurilor se utilizează doar baza64, nu și baza128.

Comentarii

    60

  • De ce nici măcar baza 256? –  > Por Gumbo.
  • 22

  • Cred că ideea este de a avea imprimabile caractere (deși există și mai mult de 64…) –  > Por Felix Kling.
  • 29

  • Cred că baza 128 ne-a aparținut de ceva vreme. Echipa desemnată să păzească baza 64 încă rezistă. –  > Por Ritch Melton.
  • de ce este această întrebare specifică javascript? acest lucru este valabil și pentru majoritatea celorlalte limbaje care sunt folosite pe web, nu-i așa? –  > Por Benedikt Waldvogel.
  • @KenRockot: Văd că recunoști că unele dintre caracterele tale de 15 biți ar fi codificate în 3 octeți. Codificarea dvs. în baza 2048 înseamnă împachetarea a 11 biți în 2 octeți, ceea ce înseamnă 5,5 biți pe octet – cu jumătate de bit mai puțin decât în baza 64. –  > Por maaartinus.
8 răspunsuri
pepoluan

Problema este că cel puțin 32 de caractere din setul de caractere ASCII sunt „caractere de control” care pot fi interpretate de terminalul receptor. De exemplu, există caracterul BEL (clopot) care face ca terminalul receptor să sune. Există caracterele SOT (Start Of Transmission) și EOT (End Of Transmission), care îndeplinesc exact ceea ce sugerează numele lor. Și nu uitați caracterele CR și LF, care pot fi să aibă semnificații speciale în modul în care structurile de date sunt serializate/platinate într-un flux.

Adobe a creat codificarea Base85 pentru a utiliza mai multe caractere din setul de caractere ASCII, dar, după câte se pare, este protejat prin brevete.

Comentarii

  • Base91 pare a fi o bună opțiune open source: base91.sourceforge.net –  > Por Jorge Cevallos.
  • Merită luat în considerare faptul că o putere de 2 se potrivește mai ușor cu datele pe octeți, iar codificarea este mai simplă. Apoi, există portabilitatea; fiecare limbaj are o codificare și/sau o decodificare base64. –  > Por Lodewijk.
  • Re Base85 și Adobe: răspunsul ar putea fi mai util dacă ar cita numerele de brevet și anul de acordare. În cazul în care brevetele reprezintă o problemă, există întotdeauna btoa, care datează din 1990, nu este împovărat de brevete, iar acestea ar fi expirat oricum cu siguranță. –  > Por agc.
driis

Pentru că unele dintre cele 128 de caractere sunt neimprimabile (în special cele care se află sub punctul de cod 0x20). Prin urmare, ele nu pot fi transmise în mod fiabil ca un șir de caractere pe fir. Și, dacă treceți peste punctul de cod 128, puteți avea probleme de codificare din cauza codificărilor diferite utilizate în cadrul sistemelor.

Comentarii

Benedikt Waldvogel

După cum s-a spus deja în celelalte răspunsuri, punctul cheie este reducerea setului de caractere la imprimabil cele imprimabile.O schemă de codificare mai eficientă este basE91 deoarece utilizează un set de caractere mai mare și evită totuși caracterele de control/spațiu alb în intervalul ASCII scăzut. Pagina web conține o comparație frumoasă între binar vs. base64 vs. bază64. basE91 eficiența codificării.

Am curățat odată implementarea Java. Dacă oamenii sunt interesați, aș putea să o pun pe GitHub.

Actualizare: Acum este pe GitHub.

Comentarii

  • Aș fi interesat de versiunea java –  > Por Michael Deardeuff.
  • A împins-o la: github.com/bwaldvogel/base91 –  > Por Benedikt Waldvogel.
user3119289

Faptul că primele 32 de caractere sunt caractere de control nu are absolut nicio relevanță, deoarece nu trebuie să le folosești pentru a obține 128 de caractere. Avem 256 de caractere din care să alegem și doar primele 32 sunt caractere de control. Rămân 192 de caractere și, prin urmare, 128 este complet posibil fără a folosi caractere de control.

Iată care este motivul: trebuie să fie ceva care să arate la fel și pe care să îl puteți copia și lipi, indiferent unde. Prin urmare, trebuie să fie caractere care vor fi afișate la fel pe orice forum, chat, e-mail și așa mai departe. Asta înseamnă că nu putem folosi caractere pe care un client de forum/chat/email le poate folosi în mod obișnuit pentru formatare sau pentru a nu le lua în considerare. De asemenea, trebuie să fie caractere care să fie aceleași, indiferent de font, limbă și setări regionale.

Acesta este motivul!

Comentarii

  • Caracterele de control sunt relevante, deoarece aproape toată lumea presupunea deja punctul dumneavoastră de vedere conform căruia ar trebui să fie cât mai neutru posibil în ceea ce privește codurile/codificarea. Acest lucru vă limitează în mod necesar doar la ASCII (7 biți), care este un subset al majorității codificărilor relevante. De asemenea, nu tot internetul este curat pe 8 biți, iar o mare parte din el este defacto ASCII. Cu toate acestea, punctul dumneavoastră de vedere merită subliniat. –  > Por Tim Seguine.
  • Doar pentru a adăuga: ASCII definește doar 128 de caractere. Caracterele de la #128 la #255 sunt nu sunt definite în ASCII. Deoarece întrebarea se referă în mod explicit la ASCII și nu la „orice codificare pe 8 biți”, toate răspunsurile se limitează la cele 128 de caractere din setul ASCII. –  > Por pepoluan.
  • Folosind ca exemplu cea mai comună codificare UTF-8: octeții de la 128 la 196 ar duce imediat la erori de decodare UTF8; octeții de la 196 la 256 ar însemna că următorul octet are același caracter, dar dacă următorul octet este sub 128, ar duce din nou la erori de decodare UTF8. Cu toate acestea, aproape toate limbajele sensibile la codificarea caracterelor ar face ca biblioteca base64 să ia șirurile base64 ca șiruri sigure UTF8. Același lucru nu se poate face cu base128, deoarece nu poate fi codificat ca un șir UTF8-safe. –  > Por SOFe.
John La Rooy

Base64 este comună deoarece rezolvă o varietate de probleme (funcționează aproape peste tot unde vă puteți gândi)

  • Nu trebuie să vă faceți griji dacă transportul este curat pe 8 biți sau nu.

  • Toate caracterele din codificare sunt imprimabile. Puteți vedea le. Le puteți copiați și lipiți le. Le puteți utiliza în URL-uri (anumite variante). etc.

  • Dimensiune fixă de codificare. Știți că m octeți se poate codifica întotdeauna la n octeți.

  • Toată lumea a auzit de ea – este susținută pe scară largă, multe biblioteci, deci ușor de interoperat cu ea.

Base128 nu are toate aceste avantaje.

Se pare că este curat pe 8 biți – dar amintiți-vă că base64 folosește 65 de simboluri. Fără un caracter în afara benzii, nu puteți beneficia de avantajele unei dimensiuni fixe de codificare. Dacă folosiți un caracter în afara benzii, nu mai puteți fi curat pe 8 biți.

Totuși, nu este totul negativ.

  • base128 este mai ușor de codificat/decodificat decât base64 – trebuie doar să folosiți decalaje și măști. Poate fi important pentru implementările integrate.

  • base128 utilizează puțin mai eficient transportul decât base64 prin utilizarea mai multor biți disponibili.

Oameni fac folosesc base128 – eu îl folosesc pentru ceva acum. Doar că nu este atât de comună.

Comentarii

  • De asemenea, nu uitați că sistemele de poștă electronică/știri și alte sisteme asemănătoare (precum și XML) nu sunt întotdeauna favorabile primelor 32 de puncte de cod (de exemplu, CR LF vs. LF), dar, în rest, răspunsul dumneavoastră pare foarte bun. –  > Por SamB.
  • „că base64 folosește 65 de simboluri.” => typo sau mi-a scăpat ceva? –  > Por Kikiwa.
  • @Kikiwa, uită-te la asta Exemplu java pe wikipedia. Verificați lungimea CODES variabilă. –  > Por John La Rooy.
  • Oh, da, caracterul de umplutură „=” numai la sfârșitul încărcăturii de codificare, aveți dreptate, mulțumesc. –  > Por Kikiwa.
esaj

Nu sunt sigur, dar cred că valorile mai mici (reprezentând coduri de control sau ceva de genul acesta) nu sunt transferate în mod fiabil ca text/caractere în interiorul cererilor/răspunsurilor HTTP, iar valorile de peste 127 ar putea fi specifice local/codificării/ceva, astfel încât nu există 128 de caractere diferite care să se aștepte să funcționeze în toate browserele/platformele.

Russell Troywest

esaji are dreptate. Base64 este folosit pentru a codifica date binare pentru transmiterea prin intermediul unui protocol care se așteaptă doar la text. Este chiar în Wiki intrare.

seizu

Consultați Clasa PHP Base128. Codificarea și decodificarea cu setul de caractere ISO 8859-1.

GoogleCode PHP-Class Base128

Comentarii

  • aș fi vrut să folosească în schimb utf-8… –  > Por Janus Troelsen.
  • Codificarea de bază nu are nimic de-a face cu datele de bază. Puteți utiliza orice codificare de text pe care o doriți pentru a codifica textul/datele dvs. Ceea ce vrea să spună este că tabelul de indexare Base## utilizează setul de caractere ISO 8859-1 ASCII ca traducere. –  > Por Chad.
  • Are într-adevăr legătură cu datele de bază, de îndată ce încercați să încorporați date binare codificate în bază în text. Dacă acel text este codificat într-o altă codificare, veți avea probleme. –  > Por Stijn de Witt.
  • Nu există un set de caractere „ISO 8859-1 ASCII”. Programul codifică datele folosind 128 de caractere ISO 8859-1 imprimabile diferite. Acesta nu utilizează codul ASCII, în nici un fel, sub nicio formă. –  > Por Nisse Engström.