Дивно \ n в закодованому рядку в Ruby в Ruby


159

Вбудована бібліотека Base64 в Ruby додає деякі \ \ n's. Я не можу з’ясувати причину. Для цього спеціального прикладу:

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і знаходяться на останньому та шостому місці з кінця. Декодер (Base64.decode64) ідеально повертає назад стару рядок. Дивна річ, що ці \ n не додають значення кодованому рядку. Коли я виймаю нові рядки з вихідного рядка, декодер знову його розшифровує ідеально.

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

Більше цього, я використовував іншу бібліотеку JS для створення базового кодованого виводу з тієї ж вхідної рядок, вихід виходить без \ n''s.

Це помилка чи щось інше? Хтось раніше стикався з цим питанням?

FYI,

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

тут же дивна проблема
Надав Б

Відповіді:


223

Правка: Оскільки я написав, ця відповідь Base64.strict_encode64()була додана, що не додає нових рядків.


Документи дещо заплутані, b64encodeметод повинен додавати новий рядок для кожного 60-го символу, а приклад для encode64методу насправді використовує b64encodeметод.

Здається, pack("m")метод для класу Array, який використовується, encode64також додає нові рядки. Я б вважав помилкою дизайну, що це необов’язково.

Ви можете або видалити Newlines себе, або якщо ви використовуєте рейки, є ActiveSupport :: CoreExtensions :: Base64 :: Кодування з encode64sметодом.


44
Здається, що оскільки я написав цю відповідь, зараз strict_encode64()нібито не додаються нові рядки.
Крістофер Хаммарстрем

15
Так німий! Чому ти мені це робиш, Рубі?
Джош М.

1
Це за замовчуванням assinie, але, як згадує @ ChristofferHammarström, є спосіб отримати справжнє кодування b64 вже зараз.
Dan

1
Мабуть, це існує для того, щоб підтримувати відсталий співвід'ємник із програмним забезпеченням, яке не може обробляти довгі лінії. stackoverflow.com/a/20065991/5749914
Войовничий шимпанзе

115

У ruby-1.9.2 у вас є Base64.strict_encode64, який не додає \ n (новий рядок) наприкінці.


Це набагато простіше рішення!
Avishai

Я перевірив, що Base64.strict_encode64 неправильно закодований рядком з трьох символів. як Base64.strict_encode64 ('abc') -> YWJj. наведений вище приклад неправильно закодований.
CodeMaker

9

Так, це цілком нормально. Документ дає приклад , який демонструє лінію розщеплення. base64 робить те ж саме і в інших мовах (наприклад, Python).

Причина додавання нових рядків без вмісту на етапі кодування полягає в тому, що base64 спочатку був розроблений як механізм кодування для надсилання бінарного вмісту електронною поштою, де довжина рядка обмежена. Не соромтеся замінювати їх, якщо вони вам не потрібні.


1
Це щойно сталося в моєму додатку для Android (бібліотека Base64 Java). Мене зовсім збентежило це дивне виникнення. Узяв мене буквально 1 годину, щоб зрозуміти, що не так, а потім шукав помилку. Цей коментар допомагає зрозуміти проблеми спадщини навіть після 6 років.
бурглахобіт

5

Здається, їх треба позбавити / проігнорувати, як-от:

Base64.encode64(str).gsub(/\n/, '')

Це рішення забруднене .. ще щось?
Арнольд Роа

1
@yaauie ( через запропоновану редакцію ): Правки, які вносять істотні зміни, як правило, не слід робити. Я рекомендую розмістити це як окрему відповідь.
Pokechu22


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.