Strano \ n in base64 codificato stringa in Ruby
Domanda
La biblioteca integrato Base64 in Ruby è l'aggiunta di un po 'di \ n di. Sono in grado di scoprire il motivo. Per questo esempio speciale:
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"
\ n di sono all'ultimo e 6 ° posizione dalla fine. Il decoder (Base64.decode64) ritorna la stringa vecchia perfettamente. cosa strana è, questi \ n di non aggiungere alcun valore alla stringa codificata. Quando rimuove le nuove righe dalla stringa di output, il decodificatore decodifica di nuovo perfettamente.
irb(main):005:0> Base64.decode64(Base64.encode64(str).gsub("\n", '')) == str
=> true
Più di questo, ho usato un un'altra libreria JS per produrre i base64 uscita della stessa stringa di input codificati, l'uscita viene senza \ n di.
Questo è un bug o qualsiasi altra cosa? Qualcuno ha affrontato questo problema prima?
Cordiali saluti,
$ ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
Soluzione
Modifica Da quando ho scritto questa risposta Base64.strict_encode64()
è stato aggiunto, che non aggiunge a capo.
La documentazione 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 di pack("m")
per la classe Array usato da encode64
aggiunge anche i ritorni a capo. Lo considererei un errore di progettazione che questo non è opzionale.
Si potrebbe rimuovere i ritorni a capo da soli, o se si sta utilizzando rotaie, c'è ActiveSupport :: CoreExtensions :: :: Base64 codifica con il metodo encode64s
.
Altri suggerimenti
In ruby-1.9.2 avete Base64.strict_encode64 che non aggiunge che \ n (nuova riga) alla fine.
Sì, questo è del tutto normale. Il doc fornisce un esempio che dimostra la line- splitting. Base64 fa la stessa cosa anche in altre lingue (ad es. Python).
Il motivo a capo senza contenuti vengono aggiunti in fase di codifica Base64 è perché è stato originariamente concepito come un meccanismo di codifica per l'invio di contenuto binario in e-mail, in cui la lunghezza della linea è limitata. Sentitevi liberi di sostituirli via se non ne hanno bisogno.
Sembra hanno avuto modo di essere spogliato / ignorata, come:
Base64.encode64(str).gsub(/\n/, '')
Il \n
aggiunto quando si utilizza Base64#encode64
è corretta, controllare questo post out: https://glaucocustodio.github.io/2014/09/27/a-reminder-about-base64encode64-in-ruby/
strict_encode64
Usa. encode64
aggiunge \ n ogni 60 simboli