2010-07-06 11 views
41

Qual è il modo migliore di invio di contenuto binario tra il sistema all'interno di un documento XMLBase64 vs HEX per l'invio di contenuto binario su internet nel doc XML

So di Base64 e Hex, qual è la vera differenza. Attualmente sto usando Base64 ma ho bisogno di includere una libreria di commons esterna per questo dove, come con HEX, penso che potrei semplicemente creare una funzione.

+0

Quindi quello che stai dicendo è che se hai questo numero binario 1110 hex prenderà due caratteri per ogni byte, quindi tecnicamente avresti detto AABBCCDD che poi sarebbe il valore esadecimale, ma in Base64 ci vogliono tre caratteri AAABBBCCCDDD. Questo sarebbe il modo tecnico per guardarlo. Sono sicuro che il AABBCCDD non è il valore corretto in esadecimale per il numero. Perché alcune funzioni di hash restituiscono il valore in lunghezze leggermente diverse. Per esempio ho avuto un esempio MD 5 questa mattina che ho provato con A poi B e poi C e il valore di hash B era un carattere in meno rispetto agli altri due. Doug –

risposta

85

Si potrebbe semplicemente scrivere il proprio metodo anche per Base64 ... ma in genere consiglio di utilizzare librerie esterne ben testate per entrambi. (Non è che ci sia carenza di loro.)

La differenza tra Base64 e hex è in realtà solo come vengono rappresentati i byte. Hex è un altro modo per dire "Base16". Hex prenderà due caratteri per ogni byte - Base64 prende 4 caratteri per ogni 3 byte, quindi è più efficiente di hex. Supponendo che tu stia usando UTF-8 per codificare il documento XML, un file da 100K richiederà 200K per la codifica in hex o 133K in Base64. Certo, potrebbe essere che non ti interessi dell'efficienza dello spazio, in molti casi non importa. Se il numero è uguale a, allora Base64 è meglio su questo fronte. (Ci sono alternative che sono anche più efficienti, ma non sono così comuni.)

+0

Beh, questo è per un telefono cellulare, quindi includere il codec commons sembra un po 'eccessivo, potrei semplicemente seguire la route HEX perché non codificherò/decodificherò molto. – jax

+7

@jax: direi che stare su un cellulare renderebbe * molto * più importante l'uso di base64, quando lo spazio sul dispositivo (memoria e memoria) è limitato, così come la larghezza di banda della rete. A meno che tu non stia salvando solo * file molto piccoli * (e non molti di loro) è probabile che tu stia molto meglio includendo una libreria base64. (Non deve essere codec commons - ci sono file sorgente di * solo * conversione base64.) –

+2

Vorrei menzionare il fatto che un valore codificato HEX mantiene il suo ordinamento quando i dati codificati vengono confrontati bit-saggio, mentre base64 no. Ciò è particolarmente importante in alcune circostanze, ad esempio quando viene utilizzato per implementare determinate strutture di dati. – Mario

4

base64 ha meno overhead (base64 produce 4 caratteri per ogni 3 byte di dati originali mentre hex produce 2 caratteri per ogni byte di dati originali). L'esadecimale è più leggibile: basta guardare i due caratteri e sapere immediatamente quale byte è dietro, ma con base64 è necessario uno sforzo per decodificare il gruppo di 4 caratteri, quindi il debugging sarà più semplice con hex.

19

C'è solo due 'differenze reali':

  1. Il radix. Base64 è base-64, sorpresa, e hex è base-16.

  2. Codifica: base-64 codifica 3 byte di origine in 4 caratteri di base 64 (http://en.wikipedia.org/wiki/Base64#Examples); hex codifica 1 byte in 2 caratteri esadecimali.

Quindi base64 è più compatto di hex.

+0

C'è un errore nella risposta. Ho inviato una modifica, ma è ancora in sospeso. Il punto 2 dovrebbe essere: "2. La codifica: base-64 codifica 3 byte sorgente in 4 caratteri base 64 (http://en.wikipedia.org/wiki/Base64#Examples); hex codifica 1 byte in 2 esadecimali personaggi." – Roberto

+0

@Roberto Sì, grazie. – EJP

10

Altre risposte chiariscono la differenza di efficienza tra base16 e base64.

C'è più per basare la selezione che l'efficienza.

Base64 utilizza più di lettere e numeri. Different implementations utilizza diversi caratteri di punteggiatura per indicare il riempimento e creare gli ultimi due caratteri del set di 64. Questi possono includere più "+" e uguale a "=". entrambi problematici nelle stringhe di query HTTP.

Quindi un motivo per favorire base16 su base64 è che i valori di base16 possono essere composti direttamente nelle stringhe di query HTTP senza richiedere ulteriore codifica. È importante per te?

Si noti che questa è una preoccupazione aggiuntiva, al di là dell'efficienza. Nessuna base è intrinsecamente migliore o peggiore; sono solo due punti diversi su una scala, in cui troverai proprietà diverse che saranno più o meno interessanti in diverse situazioni.

Ad esempio, considerare base32. È 20% meno efficiente di base64, ma è ancora adatto per l'uso nelle stringhe di query HTTP. La maggior parte della sua inefficienza deriva dall'essere insensibile alle maiuscole e minuscole, evitando zero "0" e uno "1", agli errori nella riproduzione da parte dell'uomo.

Quindi base32 introduce una nuova preoccupazione; facilità di riproduzione per l'uomo. È una preoccupazione per te? Se non lo è, si può andare per qualcosa come base62, che è ancora conveniente nelle stringhe di query HTTP, ma è case sensitive e include zero "0" e "1".

Si spera, ho chiarito che la selezione della base di codifica è una questione di scorrimento lungo una scala fino a ottenere la migliore efficienza possibile prima di sacrificare ciò che è importante per te.

Wikipedia ha una lista divertente di numeral systems.

+0

La sensibilità alle maiuscole e minuscole è ciò che mi ha spinto a scegliere sia base32 o hex su base64. Grazie per il consiglio! – hourback

2

La dimensione è importante per te?

Base64 è più efficiente in termini di spazio. Usare 4 caratteri per rappresentare 3 byte dove come hex usa 2 caratteri per ogni byte. In altre parole: esadecimale aumenta la dimensione della stringa con il 100%. Per le stringhe piccole che si adattano come parametri nelle richieste di URL non mi dispiacerebbe il costo extra/dimensione.

La facilità d'uso è importante per te?

Hex è più facile da usare rispetto Base64, perché non c'è bisogno di fuggire (potrebbe contenere +, = e /) quando si utilizza la stringa come parametro entrare in richieste di URL.

L'uso diffuso è importante per te?

Non ho i numeri, ma Base64 potrebbe essere più noto allo sviluppatore generale che hex a seconda di diversi fattori. Conoscevo base64 molto prima dell'esagono (base16).

2

Ero curioso di sapere come su EARTH base64 è possibile convertire 3 byte di input in 4 byte di output per una crescita dello spazio del 33% (mentre hex converte 1 byte di input in 2 byte di output per una crescita dello spazio del 100%). Perché in particolare 3 byte di input?

La risposta è:

3 byte = 3 x 8 bit = 24 bit.

Perché quel magico numero "24 bit"? Bene, la base 64 rappresenta i numeri da 0 a 63. Come sono rappresentati in binario? Con 000000 (0) a 111111 (63).

Bingo! Ogni carattere base64 rappresenta 6 bit di dati di input utilizzando un singolo byte di uscita (un singolo carattere come "Z", ecc.).

Quindi 24 bit (3 byte completi di input)/6 bit (alfabeto Base64) = 4 byte di base64. Questo è tutto!

Si potrebbe pensare "Perché non base128 (7 bit di input = 8 bit di output), con una crescita di appena il 14% quando si codifica?". La risposta è che base64 è il migliore che possiamo trovare, dal momento che i 128 caratteri ASCII inferiori non sono tutti stampabili. Molti sono caratteri di controllo come NULL, ecc.

Ci sono ovviamente modi per creare altri sistemi come forse "base81" ecc., Dato che puoi fare tutto ciò che vuoi se crei un algoritmo di codifica personalizzato. Ma la bellezza di base64 è come codifica i dati in modo così pulito in blocchi di 6 bit. In modo che lo schema di codifica divenne popolare.

Ora siete sperabilmente più saggi dopo aver letto questo.

Problemi correlati