Wbudowana biblioteka Base64 w Rubim dodaje kilka '\ n'. Nie mogę znaleźć przyczyny. W tym szczególnym przykładzie:
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 są na ostatniej i szóstej pozycji od końca. Dekoder (Base64.decode64) doskonale zwraca stary ciąg. Dziwne jest to, że te \ n nie dodają żadnej wartości do zakodowanego ciągu. Kiedy usuwam znaki nowej linii z ciągu wyjściowego, dekoder dekoduje go ponownie doskonale.
irb(main):005:0> Base64.decode64(Base64.encode64(str).gsub("\n", '')) == str
=> true
Co więcej, użyłem innej biblioteki JS do wytworzenia wyjścia zakodowanego w base64 tego samego ciągu wejściowego, wyjście jest bez \ n.
Czy to błąd czy coś innego? Czy ktoś wcześniej spotkał się z tym problemem?
FYI,
$ ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
Odpowiedzi:
Edycja: Odkąd napisałem, ta odpowiedź
Base64.strict_encode64()
została dodana, co nie dodaje nowych linii.Dokumentacja jest nieco zagmatwana,
b64encode
metoda ma dodawać nową linię dla każdego 60-tego znaku, a przykładencode64
metody faktycznie używa tejb64encode
metody.Wygląda na to, że
pack("m")
metoda klasy Array używana przezencode64
również dodaje nowe linie. Uznałbym za błąd projektowy, że nie jest to opcjonalne.Możesz albo samodzielnie usunąć znaki nowej linii, albo jeśli używasz railsów , możesz skorzystać z
encode64s
metody ActiveSupport :: CoreExtensions :: Base64 :: Encoding .źródło
strict_encode64()
która rzekomo nie dodaje nowych linii.W ruby-1.9.2 masz Base64.strict_encode64, który nie dodaje tego \ n (nowej linii) na końcu.
źródło
Tak, to całkiem normalne. Dokument podaje przykład wykazujące skład podziału. base64 robi to samo również w innych językach (np. Python).
Powodem dodawania nowych linii bez treści na etapie kodowania jest to, że base64 został pierwotnie opracowany jako mechanizm kodowania do wysyłania binarnej zawartości w wiadomości e-mail, gdzie długość linii jest ograniczona. Możesz je wymienić, jeśli ich nie potrzebujesz.
źródło
Wygląda na to, że należy je usunąć / zignorować, na przykład:
źródło
Użyj
strict_encode64
metody.encode64
dodaje \ n co 60 symboliźródło
\n
Dodane przy użyciuBase64#encode64
jest poprawna, sprawdź ten post out: https://glaucocustodio.github.io/2014/09/27/a-reminder-about-base64encode64-in-ruby/źródło