2010-04-12 12 views
105

La libreria Base64 incorporata in Ruby aggiunge alcuni '\ n. Non riesco a scoprire il motivo. Per questo esempio speciale:Strano n nella stringa codificata in Base64 in Ruby

irb(main):001:0> require 'rubygems' 
=> true 
irb(main):002:0> require 'base64' 
=> true 
irb(main):003:0> str = "1110--ad6ca0b06e1fbeb7e6518a0418a73a6e04a67054" 
=> "1110--ad6ca0b06e1fbeb7e6518a0418a73a6e04a67054" 
irb(main):004:0> Base64.encode64(str) 
=> "MTExMC0tYWQ2Y2EwYjA2ZTFmYmViN2U2NTE4YTA0MThhNzNhNmUwNGE2NzA1\nNA==\n" 

Gli \ n sono all'ultima e alla sesta posizione dalla fine. Il decodificatore (Base64.decode64) restituisce perfettamente la vecchia stringa. Stranamente, questi \ n non aggiungono alcun valore alla stringa codificata. Quando rimuovo i newline dalla stringa di output, il decodificatore lo decodifica di nuovo perfettamente.

irb(main):005:0> Base64.decode64(Base64.encode64(str).gsub("\n", '')) == str 
=> true 

più su questo, ho usato un un'altra libreria JS per produrre i base64 uscita della stessa stringa di input codificati, l'uscita viene senza il \ n del.

Si tratta di un bug o di qualsiasi altra cosa? Qualcuno ha affrontato questo problema prima?

FYI,

$ ruby -v 
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux] 

risposta

135

Edit: Da quando ho scritto questa risposta Base64.strict_encode64() è stato aggiunto, che non aggiunge a capo.


The docs sono un po 'confuso, il metodo b64encode si suppone per aggiungere una nuova riga per ogni carattere 60th, e l'esempio per il metodo encode64 è in realtà utilizzando il metodo b64encode.

Sembra che il metodo pack("m") per la classe Array utilizzata da encode64 aggiunga anche le nuove righe. Lo considererei un bug di progettazione che non è facoltativo.

È possibile rimuovere personalmente le newline o se si utilizzano le guide, c'è il ActiveSupport::CoreExtensions::Base64::Encoding con il metodo encode64s.

+37

Sembra che da quando ho scritto questa risposta ora ci sia 'strict_encode64()' che apparentemente non aggiunge newline. –

+12

Così stupido! Perché mi fai questo, Ruby? –

+1

Questo mi stava uccidendo! Ho appena perso un'ora senza una buona ragione! –

9

Sì, questo è abbastanza normale. Il doc fornisce un esempio che dimostra la suddivisione in linea. base64 fa la stessa cosa anche in altri linguaggi (es. Python).

Il motivo per cui le nuove righe senza contenuto sono aggiunte nella fase di codifica è perché base64 è stato originariamente concepito come meccanismo di codifica per l'invio di contenuto binario nella posta elettronica, dove la lunghezza della linea è limitata. Sentiti libero di sostituirli se non ne hai bisogno.

+1

Questo è appena successo nella mia app per Android (Java Base64 library). Ero totalmente confuso da questo strano evento. Mi sono preso letteralmente un'ora per capire cosa c'è che non va e poi ho cercato l'errore. Questo commento aiuta a capire i problemi legacy anche dopo 6 anni. –

99

In Ruby-1.9.2 si ha Base64.strict_encode64 che non aggiunge che \ n (newline) alla fine.

+0

Questa è una soluzione molto più semplice! – Avishai

+0

Questa dovrebbe essere la risposta accettata – Darbio

+0

Grazie per la soluzione !!! – qcam

2

Sembra hanno avuto modo di essere spogliato/ignorata, come:

Base64.encode64(str).gsub(/\n/, '') 
+0

Questa soluzione è sporca .. qualcos'altro? –

+1

@yaauie ([tramite modifica suggerita] (http://stackoverflow.com/review/suggested-edits/6210102)): le modifiche che apportano modifiche sostanziali in genere non dovrebbero essere eseguite. Consiglierei di postarlo come risposta separata. – Pokechu22

0

Usa strict_encode64 metodo. encode64 aggiunge \ n ogni 60 simboli

Problemi correlati