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]
È stato utile?

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/

Metodo strict_encode64

Usa. encode64 aggiunge \ n ogni 60 simboli

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