A biblioteca Base64 embutida no Ruby está adicionando alguns '\ n' s. Não consigo descobrir o motivo. Para este exemplo especial:
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"
Os \ n estão na última e na sexta posição do final. O decodificador (Base64.decode64) retorna a string antiga perfeitamente. O estranho é que esses \ n não agregam valor à string codificada. Quando removo as novas linhas da string de saída, o decodificador a decodifica novamente perfeitamente.
irb(main):005:0> Base64.decode64(Base64.encode64(str).gsub("\n", '')) == str
=> true
Além disso, usei uma outra biblioteca JS para produzir a saída codificada em base64 da mesma sequência de entrada, a saída vem sem os \ n's.
Isso é um bug ou algo mais? Alguém já enfrentou esse problema antes?
PARA SUA INFORMAÇÃO,
$ ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
Respostas:
Edit: Desde que eu escrevi esta resposta
Base64.strict_encode64()
foi adicionada, o que não adiciona novas linhas.Os documentos são um pouco confusos, o
b64encode
método deve adicionar uma nova linha para cada sexagésimo caractere, e o exemplo doencode64
método está realmente usando ob64encode
método.Parece que o
pack("m")
método para a classe Array usado porencode64
também adiciona as novas linhas. Eu consideraria um erro de design que isso não seja opcional.Você mesmo pode remover as novas linhas ou, se estiver usando trilhos, há ActiveSupport :: CoreExtensions :: Base64 :: Encoding com o
encode64s
métodofonte
strict_encode64()
que ostensivamente não adiciona novas linhas.No ruby-1.9.2, você tem o Base64.strict_encode64, que não adiciona \ n (nova linha) no final.
fonte
Sim, isso é bastante normal. O documento fornece um exemplo demonstrando a divisão de linhas. O base64 faz a mesma coisa em outros idiomas também (por exemplo, Python).
A razão pela qual as novas linhas livres de conteúdo são adicionadas no estágio de codificação é porque o base64 foi originalmente criado como um mecanismo de codificação para o envio de conteúdo binário por email, onde o comprimento da linha é limitado. Sinta-se à vontade para substituí-los, caso não precise deles.
fonte
Parece que eles precisam ser removidos / ignorados, como:
fonte
Use o
strict_encode64
métodoencode64
adiciona \ n a cada 60 símbolosfonte
Os
\n
adicionados ao usarBase64#encode64
estão corretos, confira este post: https://glaucocustodio.github.io/2014/09/27/a-reminder-about-base64encode64-in-ruby/fonte