Pustaka Base64 inbuilt di Ruby menambahkan beberapa '\ n's. Saya tidak dapat menemukan alasannya. Untuk contoh khusus ini:
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 berada pada posisi terakhir dan keenam dari ujung. Decoder (Base64.decode64) mengembalikan string yang lama dengan sempurna. Anehnya, ini tidak menambah nilai ke string yang dikodekan. Ketika saya menghapus baris baru dari string output, decoder menerjemahkannya lagi dengan sempurna.
irb(main):005:0> Base64.decode64(Base64.encode64(str).gsub("\n", '')) == str
=> true
Lebih dari ini, saya menggunakan pustaka JS lain untuk menghasilkan output disandikan base64 dari string input yang sama, output datang tanpa \ n's.
Apakah ini bug atau yang lainnya? Adakah yang pernah mengalami masalah ini sebelumnya?
FYI,
$ ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
Jawaban:
Sunting: Karena saya menulis jawaban
Base64.strict_encode64()
ini ditambahkan, yang tidak menambahkan baris baru.Dokumen agak membingungkan,
b64encode
metode ini seharusnya menambahkan baris baru untuk setiap karakter ke-60, dan contoh untukencode64
metode ini sebenarnya menggunakanb64encode
metode tersebut.Tampaknya
pack("m")
metode untuk kelas Array yang digunakan olehencode64
juga menambahkan baris baru. Saya akan menganggapnya sebagai bug desain bahwa ini bukan opsional.Anda bisa menghapus baris baru sendiri, atau jika Anda menggunakan rel, ada ActiveSupport :: CoreExtensions :: Base64 :: Pengkodean dengan
encode64s
metode ini.sumber
strict_encode64()
yang seolah-olah tidak menambahkan baris baru.Di ruby-1.9.2 Anda memiliki Base64.strict_encode64 yang tidak menambahkan \ n (baris baru) di akhir.
sumber
Ya, ini sangat normal. The doc memberi contoh menunjukkan garis-membelah. base64 juga melakukan hal yang sama dalam bahasa lain (mis. Python).
Alasan baris baru bebas konten ditambahkan pada tahap penyandian adalah karena base64 pada awalnya dirancang sebagai mekanisme penyandian untuk mengirim konten biner dalam email, di mana panjang garis dibatasi. Jangan ragu untuk menggantinya jika Anda tidak membutuhkannya.
sumber
Sepertinya mereka harus ditelanjangi / diabaikan, seperti:
sumber
Gunakan
strict_encode64
metode.encode64
menambahkan \ n setiap 60 simbolsumber
Yang
\n
ditambahkan saat menggunakanBase64#encode64
sudah benar, periksa pos ini: https://glaucocustodio.github.io/2014/09/27/a-reminder-about-base64encode64-in-ruby/sumber