Perché base128 non viene utilizzato? [chiuso]


90

Perché solo base64 invece di base128 viene utilizzato per trasmettere dati binari sul web? Il set di caratteri ASCII ha 128 caratteri che in teoria potrebbero rappresentare la base 128, ma nella maggior parte dei casi viene utilizzato solo base64 ma non base128.


60
Perché nemmeno la base 256?
Gumbo

22
Penso che il punto sia avere caratteri stampabili (sebbene ce ne siano anche più di 64 ...)
Felix Kling

29
Penso che la base 128 ci sia appartenuta tempo fa. La squadra assegnata alla base di guardia 64 sta ancora resistendo.
Ritch Melton

5
perché questa domanda è specifica per javascript? questo vale anche per la maggior parte delle altre lingue utilizzate nel web, non è vero?
Benedikt Waldvogel

5
@ KenRockot: vedo che riconosci che alcuni dei tuoi caratteri a 15 bit verrebbero codificati in 3 byte. La tua codifica in base 2048 significa comprimere 11 bit in 2 byte, il che rende 5,5 bit per byte, mezzo bit in meno rispetto a base 64.
maaartinus

Risposte:


105

Il problema è che almeno 32 caratteri del set di caratteri ASCII sono "caratteri di controllo" che possono essere interpretati dal terminale ricevente. Ad esempio, c'è il carattere BEL (campanello) che fa suonare il suono del terminale ricevente. Ci sono i caratteri SOT (Start Of Transmission) e EOT (End Of Transmission) che eseguono esattamente ciò che implicano i loro nomi. E non dimenticare i caratteri CR e LF, che possono avere significati speciali nel modo in cui le strutture dati vengono serializzate / appiattite in un flusso.

Adobe ha creato la codifica Base85 per utilizzare più caratteri nel set di caratteri ASCII, ma AFAIK è protetta da brevetti.


7
Base91 sembra una buona opzione open source: base91.sourceforge.net
Jorge Cevallos

2
Vale la pena considerare che una potenza di 2 si adatta più facilmente ai dati di byte e la codifica è più semplice. Poi c'è la portabilità; ogni lingua ha una codifica base64 e / o una decodifica base64.
Lodewijk

5
Re Base85 e Adobe : la risposta potrebbe essere resa più utile se citasse i numeri di brevetto e l'anno concesso. Se i brevetti sono un problema c'è sempre btoa, che risale al 1990, non è gravato da brevetti, e quelli sarebbero comunque scaduti.
agc

65

Perché alcuni di questi 128 caratteri non sono stampabili (principalmente quelli che si trovano al di sotto del punto di codice 0x20). Pertanto, non possono essere trasmessi in modo affidabile come una stringa sul filo. E, se vai oltre il punto di codice 128, puoi avere problemi di codifica a causa delle diverse codifiche utilizzate nei sistemi.


8
Base94 esiste qui in GitHub, utilizza tutti i 94 caratteri ASCII stampabili: gist.github.com/iso2022jp/4054241
intrepidis

15

Come già affermato nelle altre risposte, il punto fondamentale è ridurre il set di caratteri a quelli stampabili . Uno schema di codifica più efficiente è basE91 perché utilizza un set di caratteri più ampio ed evita ancora i caratteri di controllo / spazi bianchi nell'intervallo ASCII basso. La pagina web contiene un bel confronto tra l' efficienza della codifica binaria, base64 e basE91 .

Una volta ho ripulito l'implementazione di Java. Se le persone sono interessate, potrei spingerlo su GitHub.

Aggiornamento : ora è su GitHub .


Sarei interessato alla versione Java
Michael Deardeuff


12

Che i primi 32 caratteri siano caratteri di controllo non ha assolutamente alcuna rilevanza, perché non è necessario utilizzarli per ottenere 128 caratteri. Abbiamo 256 caratteri tra cui scegliere e solo i primi 32 sono caratteri di controllo. Restano 192 caratteri, quindi 128 è completamente possibile senza utilizzare caratteri di controllo.

Ecco il motivo: deve essere qualcosa che avrà lo stesso aspetto e che puoi copiare e incollare, non importa dove. Pertanto devono essere caratteri che verranno visualizzati allo stesso modo su qualsiasi forum, chat, e-mail e così via. Ciò significa che non possiamo utilizzare caratteri, che un client di forum / chat / posta elettronica può in genere utilizzare per la formattazione o l'ignoranza. Devono anche essere caratteri uguali, indipendentemente dal carattere, dalla lingua e dalle impostazioni regionali.

Questa è la ragione!


7
I caratteri di controllo sono rilevanti perché praticamente tutti stavano già assumendo il tuo punto di vista che dovrebbe essere il più possibile neutrale nella tabella codici / codifica. Ciò ti limita necessariamente a solo ASCII (7 bit) che è un sottoinsieme della maggior parte delle codifiche rilevanti. Inoltre, non tutta Internet è pulita a 8 bit e la maggior parte è di fatto ASCII. Vale la pena sottolineare il tuo punto.
Tim Seguine

7
Solo per aggiungere: ASCII definisce solo 128 caratteri. I caratteri da # 128 a # 255 non sono definiti in ASCII. Poiché la domanda fa riferimento esplicitamente ad ASCII e non a "qualsiasi codifica a 8 bit", tutte le risposte si limitano ai 128 caratteri del set ASCII.
pepoluan

Utilizzando la più comune codifica UTF-8 come esempio: byte da 128 a 196 comporterebbero immediatamente errori di decodifica UTF8; byte compresi tra 196 e 256 implicherebbero che anche il byte successivo è dello stesso carattere, ma se il byte successivo è inferiore a 128, si verificherebbero nuovamente errori di decodifica UTF8. Tuttavia, quasi tutti i linguaggi sensibili alla codifica dei caratteri avrebbero la libreria base64 che accetta stringhe base64 come stringhe UTF8 sicure. Lo stesso non può essere fatto con base128 poiché non può essere codificato come una stringa sicura per UTF8.
SOFe

10

Base64 è comune perché risolve una varietà di problemi (funziona quasi ovunque tu possa pensare)

  • Non devi preoccuparti se il trasporto è pulito a 8 bit o meno.

  • Tutti i caratteri nella codifica sono stampabili. Li puoi vedere . Puoi copiarli e incollarli . Puoi usarli negli URL (varianti particolari). eccetera.

  • Dimensioni di codifica fisse. Sai che i mbyte possono sempre codificare in nbyte.

  • Tutti ne hanno sentito parlare: è ampiamente supportato, molte librerie, quindi è facile interagire con.

Base128 non ha tutti questi vantaggi.

Sembra che sia pulito a 8 bit, ma ricorda che base64 utilizza 65 simboli. Senza un carattere fuori banda non puoi avere i vantaggi di una dimensione di codifica fissa. Se usi un carattere fuori banda, non puoi più essere pulito a 8 bit.

Tuttavia, non è tutto negativo.

  • base128 è più facile da codificare / decodificare rispetto a base64: devi solo usare turni e maschere. Può essere importante per le implementazioni incorporate

  • base128 fa un uso leggermente più efficiente del trasporto rispetto a base64 utilizzando più bit disponibili.

Le persone fanno uso base128 - lo sto usando per qualcosa adesso. Non è così comune.


Ricorda anche che i sistemi di posta / notizie e il loro genere (e anche XML) non sono sempre gentili con i primi 32 punti di codice (considera CR LF vs LF, per esempio), ma per il resto la tua risposta sembra molto buona.
SamB

"quella base64 usa 65 simboli." => errore di battitura o mi sono perso qualcosa?
Kikiwa

@ Kikiwa, guarda questo esempio java su wikipedia . Controlla la lunghezza della CODESvariabile.
John La Rooy

Oh sì, il carattere di riempimento '=' solo alla fine del payload di codifica, hai ragione, grazie.
Kikiwa

4

Non sono sicuro, ma penso che i valori inferiori (che rappresentano codici di controllo o qualcosa del genere) non siano trasferiti in modo affidabile come testo / caratteri all'interno di richieste / risposte HTTP, e i valori sopra 127 potrebbero essere locali / codepage / qualsiasi cosa specifica, quindi non ci sono 128 caratteri diversi che possono funzionare su tutti i browser / piattaforme.


3

esaji ha ragione. Base64 viene utilizzato per codificare i dati binari per la trasmissione utilizzando un protocollo che prevede solo testo. È proprio nella voce Wiki .


2

Controlla la base128 PHP-Class. Codifica e decodifica con set di caratteri ISO 8859-1.

GoogleCode PHP-Class Base128


1
vorrei che usasse utf-8 invece ...
Janus Troelsen,

1
La codifica di base non ha nulla a che fare con i dati sottostanti. Puoi usare qualsiasi codifica di testo che desideri per codificare il tuo testo / dati. Ciò che intende è che la tabella indice Base ## utilizza il set di caratteri ASCII ISO 8859-1 come traduzione.
Ciad

1
Ha qualcosa a che fare con i dati sottostanti non appena si tenta di incorporare dati binari con codifica di base nel testo. Se quel testo è codificato in un'altra codifica, avrai problemi.
Stijn de Witt

Non esiste un set di caratteri "ISO 8859-1 ASCII". Il programma codifica i dati utilizzando 128 diversi caratteri ISO 8859-1 stampabili. Non usa ASCII , in alcun modo, forma o forma.
Nisse Engström
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.