Ruby'de base64 kodlu dizede garip \ n


159

Ruby'deki yerleşik Base64 kütüphanesi bazı '\ n ekliyor. Sebebini bulamıyorum. Bu özel örnek için:

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'ler sondan ve 6. konumdan sona erer. Kod çözücü (Base64.decode64) eski dizeyi mükemmel bir şekilde geri döndürür. Garip bir şey, bu \ n kodlanmış dizeye herhangi bir değer katmıyor. Çıktı dizesinden yeni satırları çıkardığımda, kod çözücü kodu tekrar mükemmel şekilde çözer.

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

Dahası, aynı giriş dizesinin base64 kodlu çıktısını üretmek için başka bir JS kütüphanesi kullandım, çıktı \ n's olmadan geliyor.

Bu bir hata mı yoksa başka bir şey mi? Bu sorunla daha önce karşılaşan var mı?

Bilginize,

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

burada aynı tuhaf sorun
Nadav B

Yanıtlar:


224

Düzenleme: Yazdığım beri bu Base64.strict_encode64()satır eklendi, yeni satır eklemez.


Dokümanlar biraz kafa karıştırıcı, b64encodeyöntemin her 60 karakter için yeni bir satır eklemesi gerekiyor ve encode64yönteme örnek aslında b64encodeyöntemi kullanıyor .

Görünüşe göre, pack("m")Array sınıfının kullandığı yöntem encode64de satırsonlarını ekliyor. Bunun isteğe bağlı olmadığı bir tasarım hatası olarak düşünürdüm.

Yeni satırları kendiniz kaldırabilirsiniz veya raylar kullanıyorsanız, ActiveSupport :: CoreExtensions :: Base64 :: Yöntemle kodlama vardır encode64s.


44
Görünüşe göre bu cevabı yazdığım için şimdi strict_encode64()satırsonu eklemeyen var.
Christoffer Hammarström

15
Çok aptal! Bunu bana neden yapıyorsun Ruby?
Josh M.

1
Bu bir assinie varsayılanıdır, ancak @ ChristofferHammarström'ün belirttiği gibi, şimdi gerçek bir b64 kodlaması almanın bir yolu vardır.
Dan

1
Görünüşe göre bu, uzun çizgileri işleyemeyen yazılımlarla geriye doğru uyum sağlamak için var. stackoverflow.com/a/20065991/5749914
Warlike Şempanze

115

Ruby-1.9.2'de sonunda \ n (satırsonu) eklemeyen Base64.strict_encode64 var.


Bu çok daha kolay bir çözüm!
Avishai

Base64.strict_encode64 üç karakter dizesi doğru kodlanmamış kontrol ettim. Base64.strict_encode64 ('abc') -> YWJj gibi. yukarıdaki örnek doğru şekilde kodlanmamış.
CodeMaker

9

Evet, bu oldukça normal. Doktor hat yarma gösteren bir örnek verilmektedir. base64 diğer dillerde de aynı şeyi yapar (örn. Python).

İçerik içermeyen yeni satırların kodlama aşamasında eklenmesinin nedeni, base64'ün başlangıçta satır uzunluğunun sınırlı olduğu e-postada ikili içerik göndermek için bir kodlama mekanizması olarak tasarlanmasıdır. İhtiyacınız yoksa değiştirmekten çekinmeyin.


1
Bu, Android Uygulamamda (Java'nın Base64 kitaplığı) oldu. Bu garip olayla tamamen kafam karışmıştı. Neyin yanlış olduğunu anlamak için tam anlamıyla 1 saat sürdü ve sonra hatayı aradı. Bu yorum, 6 yıl sonra bile eski sorunların anlaşılmasına yardımcı oluyor.
burglarhobbit



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.