Domanda

Lo so .NET supporta la codifica Base64 di array di byte. Ma ho pensato che avrei potuto risparmiare ancora più spazio se utilizzare un maggior numero di caratteri. Ho letto da qualche parte che Unicode supporta migliaia di personaggi diversi e allora perché non utilizzano la codifica base1024 per esempio? E se questo è possibile, si può dare alcune linee guida su come implementarlo. Grazie

È stato utile?

Soluzione

A seconda se si utilizza 2 byte di codifica Unicode (UCS2) o multi byte (UTF-8). Base 1024 sarebbe solo leggermente migliore o anche più spreco di spazio rispetto base64, poiché base 64 utilizza 6 bit su un byte a 8 bit. Raw dati binari convertito in Base64 diventa 4/3 più grande. (Circa 1.333x crescita)

Ma base1024 utilizzando UCS-2 (16 bit) caratteri Unicode utilizzerebbero soltanto 10 su 16 bit, per cui prenderebbe 8/5 lo spazio. dati binari grezzi convertiti in base1024 usando UCS-2 sarebbe cresciuto a 1,6 volte la sua dimensione originale. Si tratta di peggio di base64.

Se è stato utilizzato UTF-8 Unicode, invece, e sono stati attenti a utilizzare solo i caratteri Unicode che avevano 1 o 2 byte codifiche, si potrebbe ottenere al massimo più 1920 punti di codice unici su 2 personaggi, che funziona a un leggero miglioramento nella densità dei dati. (UTF-8 codifica utilizza solo 6 bit di ogni ulteriore * bit byte per indicare punti di codice, le altre 2 bit sono usati per indicare che ci sono più byte da seguire)

Quindi questo non è essere di aiuto, si dovrebbe esaminare la possibilità di comprimere i vostri dati prima di convertirlo in Base64.

Altri suggerimenti

Base64 è lì per uno scopo: memorizzare / trasferire dati binari in un formato che si inserisce in 6 bit / carattere di aggirare le restrizioni imposte da alcuni protocolli. Se non si dispone di una tale restrizione, base64 non è per voi. Non è mai stato progettato per risparmiare spazio. Se avete bisogno di risparmiare spazio e si è liberi di utilizzare qualsiasi cosa, quindi è sufficiente memorizzare la matrice come dati binari.

Il punto di base64 è quello di evitare problemi di codifica. Praticamente tutte le macchine ancora in corso d'accordo sul set di caratteri ASCII. Anche se probabilmente c'è ancora un paio di macchine EBCDIC là fuori che consumano kilowatt. ASCII codifica solo 96 caratteri non ambigue. Base64 utilizza 64 di questi, oltre a un carattere di riempimento. Base128 è già troppo.

Non c'è nulla di ambiguo su Unicode, codifiche comuni in uso sono UTF7, UTF8, UTF16, UTF-32, UCS-2 e le loro varietà almeno-endian e big-endian. Base1024 richiederebbe 1024 caratteri inequivocabili, modo troppo per chiunque di sempre d'accordo. Si noti che non può essere solo una gamma codificato, le tabelle Unicode hanno un sacco di buchi e sono distribuiti in modo casuale.

Mentre gli altri già citati, base64 non salva qualsiasi spazio. Soffia anche il numero di caratteri necessari per contenere le stesse informazioni (dare un'occhiata a wikipedia vedere che tre byte bisogno quattro caratteri per la rappresentazione).

Se avete veramente bisogno di risparmiare un po 'di spazio e vuole comprimere un array di byte si dovrebbe dare uno sguardo al algoritmo LZMA . E se avete bisogno di un'implementazione di questo algoritmo in C, C ++, C # o Java diano un'occhiata al 7zip pagina .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top